From 1502c108dbb36a1fc94c9fac7eae4185f9f21da5 Mon Sep 17 00:00:00 2001 From: Nwokolo Godwin Date: Fri, 25 Dec 2020 02:27:09 +0100 Subject: [PATCH 001/112] Add Methods To Check If Event Starts And Ends This Year --- events/models.py | 18 ++++++++++++++++++ events/tests/test_models.py | 23 ++++++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/events/models.py b/events/models.py index 3334ca326..c3b84ec18 100644 --- a/events/models.py +++ b/events/models.py @@ -181,6 +181,24 @@ def next_time(self): except IndexError: return None + def is_scheduled_to_start_this_year(self) -> bool: + current_year: int = datetime.datetime.now().year + try: + if self.next_time.dt_start.year == current_year: + return True + except Exception: + pass + return False + + def is_scheduled_to_end_this_year(self) -> bool: + current_year: int = datetime.datetime.now().year + try: + if self.next_time.dt_end.year == current_year: + return True + except Exception: + pass + return False + @property def previous_time(self): now = timezone.now() diff --git a/events/tests/test_models.py b/events/tests/test_models.py index 0f3bafe76..b6d2e7ef3 100644 --- a/events/tests/test_models.py +++ b/events/tests/test_models.py @@ -62,7 +62,6 @@ def test_recurring_event(self): self.assertEqual(self.event.next_time.dt_start, recurring_time_dtstart) self.assertTrue(rt.valid_dt_end()) - rt.begin = now - datetime.timedelta(days=5) rt.finish = now - datetime.timedelta(days=3) rt.save() @@ -186,3 +185,25 @@ def test_event_previous_event(self): # 'Event.previous_event' can return None if there is no # OccurringRule or RecurringRule found. self.assertIsNone(self.event.previous_event) + + def test_scheduled_to_start_this_year_method(self): + now = seconds_resolution(timezone.now()) + + occurring_time_dtstart = now + datetime.timedelta(days=3) + OccurringRule.objects.create( + event=self.event, + dt_start=occurring_time_dtstart, + dt_end=occurring_time_dtstart + ) + self.assertTrue(self.event.is_scheduled_to_start_this_year()) + + def test_scheduled_to_end_this_year_method(self): + now = seconds_resolution(timezone.now()) + + occurring_time_dtstart = now + datetime.timedelta(days=3) + OccurringRule.objects.create( + event=self.event, + dt_start=occurring_time_dtstart, + dt_end=occurring_time_dtstart + ) + self.assertTrue(self.event.is_scheduled_to_end_this_year()) From 4198812511cc9b2cce9ca5c8192fdb8508fc98a3 Mon Sep 17 00:00:00 2001 From: Nwokolo Godwin Date: Fri, 25 Dec 2020 03:31:06 +0100 Subject: [PATCH 002/112] Set Up Templates For Querying Start And End Years Passed variables to the time_tag template [time_tag.html] that checks if an event was scheduled to start or end with the current year. --- templates/events/event_list.html | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/templates/events/event_list.html b/templates/events/event_list.html index bbfb764d2..285fa0c7d 100644 --- a/templates/events/event_list.html +++ b/templates/events/event_list.html @@ -45,8 +45,12 @@

U

{{ object.title|striptags }}

{% with object.next_time as next_time %} + {% with object.is_scheduled_to_start_this_year as scheduled_start_this_year %} + {% with object.is_scheduled_to_end_this_year as scheduled_end_this_year %} {% include "events/includes/time_tag.html" %} {% endwith %} + {% endwith %} + {% endwith %} {% if object.venue %} {% if object.venue.url %}{% endif %}{{ object.venue.name }}{% if object.venue.url %}{% endif %}{% if object.venue.address %}, {{ object.venue.address }}{% endif %} @@ -65,8 +69,12 @@

You just missed...

{{ object.title|striptags }}

{% with object.previous_time as next_time %} + {% with object.is_scheduled_to_start_this_year as scheduled_start_this_year %} + {% with object.is_scheduled_to_end_this_year as scheduled_end_this_year %} {% include "events/includes/time_tag.html" %} {% endwith %} + {% endwith %} + {% endwith %} {% if object.venue %} {% if object.venue.url %}{% endif %}{{ object.venue.name }}{% if object.venue.url %}{% endif %}{% if object.venue.address %}, {{ object.venue.address }}{% endif %} From ff1ad8b61ffed710d3935e901ad49e4a8b70a5ee Mon Sep 17 00:00:00 2001 From: Nwokolo Godwin Date: Fri, 25 Dec 2020 03:35:17 +0100 Subject: [PATCH 003/112] Insert New Test Data And Update test_views.py More events are created to test particular scenarios of events especially events set to start or end at a future year. --- events/tests/test_views.py | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/events/tests/test_views.py b/events/tests/test_views.py index 691817036..b8603bfdf 100644 --- a/events/tests/test_views.py +++ b/events/tests/test_views.py @@ -6,7 +6,7 @@ from django.test import TestCase from django.utils import timezone -from ..models import Calendar, Event, EventCategory, EventLocation, RecurringRule +from ..models import Calendar, Event, EventCategory, EventLocation, RecurringRule, OccurringRule from ..templatetags.events import get_events_upcoming from users.factories import UserFactory @@ -18,6 +18,11 @@ def setUpTestData(cls): cls.calendar = Calendar.objects.create(creator=cls.user, slug="test-calendar") cls.event = Event.objects.create(creator=cls.user, calendar=cls.calendar) cls.event_past = Event.objects.create(title='Past Event', creator=cls.user, calendar=cls.calendar) + cls.event_single_day = Event.objects.create(title="Single Day Event", creator=cls.user, calendar=cls.calendar) + cls.event_future_start_following_year = Event.objects.create(title='Event Starts Following Year', + creator=cls.user, calendar=cls.calendar) + cls.event_future_end_following_year = Event.objects.create(title='Event Ends Following Year', + creator=cls.user, calendar=cls.calendar) cls.now = timezone.now() @@ -34,12 +39,27 @@ def setUpTestData(cls): begin=cls.now - datetime.timedelta(days=2), finish=cls.now - datetime.timedelta(days=1), ) - + cls.rule_single_day = OccurringRule.objects.create( + event=cls.event_single_day, + dt_start=recurring_time_dtstart, + dt_end=recurring_time_dtstart + ) + cls.rule_future_start_year = OccurringRule.objects.create( + event=cls.event_future_start_following_year, + dt_start=recurring_time_dtstart + datetime.timedelta(weeks=52), + dt_end=recurring_time_dtstart + datetime.timedelta(weeks=53), + ) + cls.rule_future_end_year = OccurringRule.objects.create( + event=cls.event_future_end_following_year, + dt_start=recurring_time_dtstart, + dt_end=recurring_time_dtend + datetime.timedelta(weeks=52) + ) def test_events_homepage(self): url = reverse('events:events') response = self.client.get(url) self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.context['object_list']), 1) + self.assertEqual(len(response.context['object_list']), 4) + self.assertIn(Event.objects.last().title, response.content.decode()) def test_calendar_list(self): calendars_count = Calendar.objects.count() @@ -54,7 +74,7 @@ def test_event_list(self): response = self.client.get(url) self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.context['object_list']), 1) + self.assertEqual(len(response.context['object_list']), 4) url = reverse('events:event_list_past', kwargs={"calendar_slug": 'unexisting'}) response = self.client.get(url) @@ -114,7 +134,7 @@ def test_event_list_date(self): response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertEqual(response.context['object'], dt.date()) - self.assertEqual(len(response.context['object_list']), 2) + self.assertEqual(len(response.context['object_list']), 5) def test_eventlocation_list(self): venue = EventLocation.objects.create( @@ -150,12 +170,12 @@ def test_event_detail(self): self.assertEqual(self.event, response.context['object']) def test_upcoming_tag(self): - self.assertEqual(len(get_events_upcoming()), 1) + self.assertEqual(len(get_events_upcoming()), 4) self.assertEqual(len(get_events_upcoming(only_featured=True)), 0) self.rule.begin = self.now - datetime.timedelta(days=3) self.rule.finish = self.now - datetime.timedelta(days=2) self.rule.save() - self.assertEqual(len(get_events_upcoming()), 0) + self.assertEqual(len(get_events_upcoming()), 3) class EventSubmitTests(TestCase): From e3125d9f41a0c2d42ebc9d37dbc8a380b49c60ac Mon Sep 17 00:00:00 2001 From: Nwokolo Godwin Date: Fri, 25 Dec 2020 03:38:22 +0100 Subject: [PATCH 004/112] Time Tag Now Shows Year For Events With Details Not Within The Current Year The time tag now displays the year when an event will occur. This is only for events that have been scheduled to start or end in at a future year. The accompanying functional tests have also been included. --- events/tests/test_events_functional_test.py | 41 +++++++++++++++++++++ templates/events/includes/time_tag.html | 31 +++++++++++++++- 2 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 events/tests/test_events_functional_test.py diff --git a/events/tests/test_events_functional_test.py b/events/tests/test_events_functional_test.py new file mode 100644 index 000000000..2813316d7 --- /dev/null +++ b/events/tests/test_events_functional_test.py @@ -0,0 +1,41 @@ +from django.test import LiveServerTestCase, TestCase +from django.utils import timezone +from selenium.common.exceptions import WebDriverException +from selenium.webdriver import Chrome + +from .test_views import EventsViewsTests +from ..models import Event + + +class EventsPageFunctionalTests(LiveServerTestCase, TestCase): + @classmethod + def setUpClass(cls): + EventsViewsTests().setUpTestData() + super().setUpClass() + cls.now = timezone.now() + + def setUp(self) -> None: + try: + self.browser = Chrome() + self.browser.implicitly_wait(5) + except WebDriverException: # GitHub Actions Django CI + from selenium import webdriver + self.browser = webdriver.FirefoxOptions() + self.browser.headless = True + webdriver.Firefox(options=self.browser) + + def tearDown(self) -> None: + self.browser.quit() + + def test_event_starting_future_year_displays_year(self): + event = Event.objects.get(title=f"Event Starts Following Year") + self.browser.get(self.live_server_url + '/events/') + future_event_span_value = self.browser.find_element_by_id(str(event.id)) + self.assertIn(str(event.next_time.dt_start.year), future_event_span_value.text) + + def test_event_ending_future_year_displays_year(self): + event = Event.objects.get(title=f"Event Ends Following Year") + self.browser.get(self.live_server_url + '/events/') + future_event_span_value = self.browser.find_element_by_id(str(event.id)) + self.assertIn(str(event.next_time.dt_end.year), future_event_span_value.text) + diff --git a/templates/events/includes/time_tag.html b/templates/events/includes/time_tag.html index 078fcf1dc..c79d0b810 100644 --- a/templates/events/includes/time_tag.html +++ b/templates/events/includes/time_tag.html @@ -1,5 +1,32 @@ {% if next_time.single_day %} - + {% else %} - + {% endif %} \ No newline at end of file From 178742b4122d7f80f665cb8d798ddde0feddf900 Mon Sep 17 00:00:00 2001 From: Nwokolo Godwin Date: Fri, 25 Dec 2020 06:09:42 +0100 Subject: [PATCH 005/112] Move All Test Data To Functional Test All test data concerning the provision of data to serve the functional tests have been moved to the functional test. As it improves readability. All other test data at test_views.py was reset to accommodate for the reduction in number of test data instances. --- events/tests/test_events_functional_test.py | 51 +++++++++++++++------ events/tests/test_views.py | 25 +++------- 2 files changed, 42 insertions(+), 34 deletions(-) diff --git a/events/tests/test_events_functional_test.py b/events/tests/test_events_functional_test.py index 2813316d7..f07146a9b 100644 --- a/events/tests/test_events_functional_test.py +++ b/events/tests/test_events_functional_test.py @@ -1,18 +1,38 @@ -from django.test import LiveServerTestCase, TestCase +import datetime + +from django.contrib.auth import get_user_model +from django.test import LiveServerTestCase from django.utils import timezone from selenium.common.exceptions import WebDriverException from selenium.webdriver import Chrome -from .test_views import EventsViewsTests -from ..models import Event +from ..models import Event, OccurringRule, Calendar -class EventsPageFunctionalTests(LiveServerTestCase, TestCase): +class EventsPageFunctionalTests(LiveServerTestCase): @classmethod def setUpClass(cls): - EventsViewsTests().setUpTestData() - super().setUpClass() cls.now = timezone.now() + cls.user = get_user_model().objects.create_user(username='username', password='password') + cls.calendar = Calendar.objects.create(creator=cls.user, slug="test-calendar-2") + cls.event_future_start_following_year = Event.objects.create(title='Event Starts Following Year', + creator=cls.user, calendar=cls.calendar) + cls.event_future_end_following_year = Event.objects.create(title='Event Ends Following Year', + creator=cls.user, calendar=cls.calendar) + recurring_time_dtstart = cls.now + datetime.timedelta(days=3) + recurring_time_dtend = recurring_time_dtstart + datetime.timedelta(days=5) + + cls.rule_future_start_year = OccurringRule.objects.create( + event=cls.event_future_start_following_year, + dt_start=recurring_time_dtstart + datetime.timedelta(weeks=52), + dt_end=recurring_time_dtstart + datetime.timedelta(weeks=53), + ) + cls.rule_future_end_year = OccurringRule.objects.create( + event=cls.event_future_end_following_year, + dt_start=recurring_time_dtstart, + dt_end=recurring_time_dtend + datetime.timedelta(weeks=52) + ) + super(EventsPageFunctionalTests, cls).setUpClass() def setUp(self) -> None: try: @@ -25,17 +45,18 @@ def setUp(self) -> None: webdriver.Firefox(options=self.browser) def tearDown(self) -> None: - self.browser.quit() + super().tearDown() + try: + self.browser.quit() + except Exception: + pass - def test_event_starting_future_year_displays_year(self): - event = Event.objects.get(title=f"Event Starts Following Year") + def test_event_starting_and_ending_future_year_displays_year(self): + event = self.event_future_start_following_year self.browser.get(self.live_server_url + '/events/') future_event_span_value = self.browser.find_element_by_id(str(event.id)) self.assertIn(str(event.next_time.dt_start.year), future_event_span_value.text) - def test_event_ending_future_year_displays_year(self): - event = Event.objects.get(title=f"Event Ends Following Year") - self.browser.get(self.live_server_url + '/events/') - future_event_span_value = self.browser.find_element_by_id(str(event.id)) - self.assertIn(str(event.next_time.dt_end.year), future_event_span_value.text) - + event_2 = Event.objects.get(title="Event Ends Following Year") + future_event_span_value = self.browser.find_element_by_id(str(event_2.id)) + self.assertIn(str(event_2.next_time.dt_end.year), future_event_span_value.text) diff --git a/events/tests/test_views.py b/events/tests/test_views.py index b8603bfdf..e111419b8 100644 --- a/events/tests/test_views.py +++ b/events/tests/test_views.py @@ -19,10 +19,6 @@ def setUpTestData(cls): cls.event = Event.objects.create(creator=cls.user, calendar=cls.calendar) cls.event_past = Event.objects.create(title='Past Event', creator=cls.user, calendar=cls.calendar) cls.event_single_day = Event.objects.create(title="Single Day Event", creator=cls.user, calendar=cls.calendar) - cls.event_future_start_following_year = Event.objects.create(title='Event Starts Following Year', - creator=cls.user, calendar=cls.calendar) - cls.event_future_end_following_year = Event.objects.create(title='Event Ends Following Year', - creator=cls.user, calendar=cls.calendar) cls.now = timezone.now() @@ -44,21 +40,12 @@ def setUpTestData(cls): dt_start=recurring_time_dtstart, dt_end=recurring_time_dtstart ) - cls.rule_future_start_year = OccurringRule.objects.create( - event=cls.event_future_start_following_year, - dt_start=recurring_time_dtstart + datetime.timedelta(weeks=52), - dt_end=recurring_time_dtstart + datetime.timedelta(weeks=53), - ) - cls.rule_future_end_year = OccurringRule.objects.create( - event=cls.event_future_end_following_year, - dt_start=recurring_time_dtstart, - dt_end=recurring_time_dtend + datetime.timedelta(weeks=52) - ) + def test_events_homepage(self): url = reverse('events:events') response = self.client.get(url) self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.context['object_list']), 4) + self.assertEqual(len(response.context['object_list']), 2) self.assertIn(Event.objects.last().title, response.content.decode()) def test_calendar_list(self): @@ -74,7 +61,7 @@ def test_event_list(self): response = self.client.get(url) self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.context['object_list']), 4) + self.assertEqual(len(response.context['object_list']), 2) url = reverse('events:event_list_past', kwargs={"calendar_slug": 'unexisting'}) response = self.client.get(url) @@ -134,7 +121,7 @@ def test_event_list_date(self): response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertEqual(response.context['object'], dt.date()) - self.assertEqual(len(response.context['object_list']), 5) + self.assertEqual(len(response.context['object_list']), 3) def test_eventlocation_list(self): venue = EventLocation.objects.create( @@ -170,12 +157,12 @@ def test_event_detail(self): self.assertEqual(self.event, response.context['object']) def test_upcoming_tag(self): - self.assertEqual(len(get_events_upcoming()), 4) + self.assertEqual(len(get_events_upcoming()), 2) self.assertEqual(len(get_events_upcoming(only_featured=True)), 0) self.rule.begin = self.now - datetime.timedelta(days=3) self.rule.finish = self.now - datetime.timedelta(days=2) self.rule.save() - self.assertEqual(len(get_events_upcoming()), 3) + self.assertEqual(len(get_events_upcoming()), 1) class EventSubmitTests(TestCase): From e0fdf7cf8c11816ce0b4c24e686d5c57a447e626 Mon Sep 17 00:00:00 2001 From: Nwokolo Godwin Date: Sun, 27 Dec 2020 12:05:09 +0100 Subject: [PATCH 006/112] Functional Test For Displaying Year Of Event For Future Events Now Implemented With Unit Tests --- events/tests/test_events_functional_test.py | 4 +- events/tests/test_views.py | 54 +++++++++++++++++++-- templates/events/includes/time_tag.html | 12 ++--- 3 files changed, 57 insertions(+), 13 deletions(-) diff --git a/events/tests/test_events_functional_test.py b/events/tests/test_events_functional_test.py index f07146a9b..b6164409b 100644 --- a/events/tests/test_events_functional_test.py +++ b/events/tests/test_events_functional_test.py @@ -54,9 +54,9 @@ def tearDown(self) -> None: def test_event_starting_and_ending_future_year_displays_year(self): event = self.event_future_start_following_year self.browser.get(self.live_server_url + '/events/') - future_event_span_value = self.browser.find_element_by_id(str(event.id)) + future_event_span_value = self.browser.find_element_by_id("start-"+str(event.id)) self.assertIn(str(event.next_time.dt_start.year), future_event_span_value.text) event_2 = Event.objects.get(title="Event Ends Following Year") - future_event_span_value = self.browser.find_element_by_id(str(event_2.id)) + future_event_span_value = self.browser.find_element_by_id("end-"+str(event_2.id)) self.assertIn(str(event_2.next_time.dt_end.year), future_event_span_value.text) diff --git a/events/tests/test_views.py b/events/tests/test_views.py index e111419b8..7fb4f1b16 100644 --- a/events/tests/test_views.py +++ b/events/tests/test_views.py @@ -19,6 +19,10 @@ def setUpTestData(cls): cls.event = Event.objects.create(creator=cls.user, calendar=cls.calendar) cls.event_past = Event.objects.create(title='Past Event', creator=cls.user, calendar=cls.calendar) cls.event_single_day = Event.objects.create(title="Single Day Event", creator=cls.user, calendar=cls.calendar) + cls.event_starts_at_future_year = Event.objects.create(title='Event Starts Following Year', + creator=cls.user, calendar=cls.calendar) + cls.event_ends_at_future_year = Event.objects.create(title='Event Ends Following Year', + creator=cls.user, calendar=cls.calendar) cls.now = timezone.now() @@ -40,12 +44,26 @@ def setUpTestData(cls): dt_start=recurring_time_dtstart, dt_end=recurring_time_dtstart ) + cls.rule_future_start_year = OccurringRule.objects.create( + event=cls.event_starts_at_future_year, + dt_start=recurring_time_dtstart + datetime.timedelta(weeks=52), + dt_end=recurring_time_dtstart + datetime.timedelta(weeks=53), + ) + cls.rule_future_end_year = OccurringRule.objects.create( + event=cls.event_ends_at_future_year, + dt_start=recurring_time_dtstart, + dt_end=recurring_time_dtend + datetime.timedelta(weeks=52) + ) + + def tearDown(self) -> None: + from django.core.cache import cache + cache.clear() def test_events_homepage(self): url = reverse('events:events') response = self.client.get(url) self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.context['object_list']), 2) + self.assertEqual(len(response.context['object_list']), 4) self.assertIn(Event.objects.last().title, response.content.decode()) def test_calendar_list(self): @@ -61,7 +79,7 @@ def test_event_list(self): response = self.client.get(url) self.assertEqual(response.status_code, 200) - self.assertEqual(len(response.context['object_list']), 2) + self.assertEqual(len(response.context['object_list']), 4) url = reverse('events:event_list_past', kwargs={"calendar_slug": 'unexisting'}) response = self.client.get(url) @@ -121,7 +139,7 @@ def test_event_list_date(self): response = self.client.get(url) self.assertEqual(response.status_code, 200) self.assertEqual(response.context['object'], dt.date()) - self.assertEqual(len(response.context['object_list']), 3) + self.assertEqual(len(response.context['object_list']), 5) def test_eventlocation_list(self): venue = EventLocation.objects.create( @@ -157,13 +175,39 @@ def test_event_detail(self): self.assertEqual(self.event, response.context['object']) def test_upcoming_tag(self): - self.assertEqual(len(get_events_upcoming()), 2) + self.assertEqual(len(get_events_upcoming()), 4) self.assertEqual(len(get_events_upcoming(only_featured=True)), 0) self.rule.begin = self.now - datetime.timedelta(days=3) self.rule.finish = self.now - datetime.timedelta(days=2) self.rule.save() - self.assertEqual(len(get_events_upcoming()), 1) + self.assertEqual(len(get_events_upcoming()), 3) + + def test_event_starting_future_year_displays_relevant_year(self): + event = self.event_starts_at_future_year + url = reverse('events:events') + response = self.client.get(url) + self.assertIn( + f'', + response.content.decode() + ) + def test_event_ending_future_year_displays_relevant_year(self): + event = self.event_ends_at_future_year + url = reverse('events:events') + response = self.client.get(url) + self.assertIn( + f'', + response.content.decode() + ) + + def test_events_scheduled_current_year_does_not_display_current_year(self): + event = self.event_single_day + url = reverse('events:events') + response = self.client.get(url) + self.assertIn( # start date + f'', + response.content.decode() + ) class EventSubmitTests(TestCase): event_submit_url = reverse_lazy('events:event_submit') diff --git a/templates/events/includes/time_tag.html b/templates/events/includes/time_tag.html index c79d0b810..90bc4491b 100644 --- a/templates/events/includes/time_tag.html +++ b/templates/events/includes/time_tag.html @@ -1,10 +1,10 @@ {% if next_time.single_day %} -

# Simple output (with Unicode)
-            >>> print(\"Hello, I'm Python!\")
+            >>> print("Hello, I'm Python!")
             Hello, I'm Python!
 
             # Input, assignment
-            >>> name = input('What is your name?\\n')
+            >>> name = input('What is your name?\n')
             What is your name?
             Python
             >>> print(f'Hi, {name}.')

From afe3cdb9ff27605c54a4ca2c5b26e2c920b3b103 Mon Sep 17 00:00:00 2001
From: Ee Durbin 
Date: Fri, 20 Jan 2023 12:16:20 -0800
Subject: [PATCH 012/112] add a sponsorship export function via admin (#2231)

---
 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}"
 

From f01f67fef9c1644328506fefe9c80764275cd418 Mon Sep 17 00:00:00 2001
From: Renato Oliveira 
Date: Thu, 26 Jan 2023 16:44:53 -0300
Subject: [PATCH 013/112] Add management command to create sponsor vouchers for
 PyCon 2023 (#2233)

* ignore Makefile .state folder

* add test and docker_shell command to Makefile

* Add command to create pycon vouchers for sponsors

* Update sponsors/management/commands/create_pycon_vouchers_for_sponsors.py

* Update sponsors/management/commands/create_pycon_vouchers_for_sponsors.py

Co-authored-by: Ee Durbin 
---
 .gitignore                                    |   1 +
 Makefile                                      |   6 +
 .../create_pycon_vouchers_for_sponsors.py     | 133 ++++++++++++++++++
 sponsors/tests/test_management_command.py     |  54 +++++++
 4 files changed, 194 insertions(+)
 create mode 100644 sponsors/management/commands/create_pycon_vouchers_for_sponsors.py
 create mode 100644 sponsors/tests/test_management_command.py

diff --git a/.gitignore b/.gitignore
index 60836490f..954ff2401 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,3 +25,4 @@ __pycache__
 .env
 .DS_Store
 .envrc
+.state/
diff --git a/Makefile b/Makefile
index 0b190f249..dc296feb4 100644
--- a/Makefile
+++ b/Makefile
@@ -50,3 +50,9 @@ shell: .state/db-initialized
 clean:
 	docker-compose down -v
 	rm -f .state/docker-build-web .state/db-initialized .state/db-migrated 
+
+test: .state/db-initialized
+	docker-compose run --rm web ./manage.py test
+
+docker_shell: .state/db-initialized
+	docker-compose run --rm web /bin/bash
diff --git a/sponsors/management/commands/create_pycon_vouchers_for_sponsors.py b/sponsors/management/commands/create_pycon_vouchers_for_sponsors.py
new file mode 100644
index 000000000..173ec31b9
--- /dev/null
+++ b/sponsors/management/commands/create_pycon_vouchers_for_sponsors.py
@@ -0,0 +1,133 @@
+import os
+from hashlib import sha1
+from calendar import timegm
+from datetime import datetime
+import sys
+from urllib.parse import urlencode
+
+import requests
+from requests.exceptions import RequestException
+
+from django.db.models import Q
+from django.conf import settings
+from django.core.management import BaseCommand
+
+from sponsors.models import (
+    SponsorBenefit,
+    BenefitFeature,
+    ProvidedTextAsset,
+    TieredBenefit,
+)
+
+BENEFITS = {
+    121: {
+        "internal_name": "full_conference_passes_2023_code",
+        "voucher_type": "SPNS_COMP_",
+    },
+    139: {
+        "internal_name": "expo_hall_only_passes_2023_code",
+        "voucher_type": "SPNS_EXPO_COMP_",
+    },
+    148: {
+        "internal_name": "additional_full_conference_passes_2023_code",
+        "voucher_type": "SPNS_EXPO_DISC_",
+    },
+    166: {
+        "internal_name": "online_only_conference_passes_2023_code",
+        "voucher_type": "SPNS_ONLINE_COMP_",
+    },
+}
+
+
+def api_call(uri, query):
+    method = "GET"
+    body = ""
+
+    timestamp = timegm(datetime.utcnow().timetuple())
+    base_string = "".join(
+        (
+            settings.PYCON_API_SECRET,
+            str(timestamp),
+            method.upper(),
+            f"{uri}?{urlencode(query)}",
+            body,
+        )
+    )
+
+    headers = {
+        "X-API-Key": str(settings.PYCON_API_KEY),
+        "X-API-Signature": str(sha1(base_string.encode("utf-8")).hexdigest()),
+        "X-API-Timestamp": str(timestamp),
+    }
+    scheme = "http" if settings.DEBUG else "https"
+    url = f"{scheme}://{settings.PYCON_API_HOST}{uri}"
+    try:
+        return requests.get(url, headers=headers, params=query).json()
+    except RequestException:
+        raise
+
+
+def generate_voucher_codes(year):
+    for benefit_id, code in BENEFITS.items():
+        for sponsorbenefit in (
+            SponsorBenefit.objects.filter(sponsorship_benefit_id=benefit_id)
+            .filter(sponsorship__status="finalized")
+            .all()
+        ):
+            try:
+                quantity = BenefitFeature.objects.instance_of(TieredBenefit).get(
+                    sponsor_benefit=sponsorbenefit
+                )
+            except BenefitFeature.DoesNotExist:
+                print(
+                    f"No quantity found for {sponsorbenefit.sponsorship.sponsor.name} and {code['internal_name']}"
+                )
+                continue
+            try:
+                asset = ProvidedTextAsset.objects.filter(
+                    sponsor_benefit=sponsorbenefit
+                ).get(internal_name=code["internal_name"])
+            except ProvidedTextAsset.DoesNotExist:
+                print(
+                    f"No provided asset found for {sponsorbenefit.sponsorship.sponsor.name} with internal name {code['internal_name']}"
+                )
+                continue
+
+            result = api_call(
+                f"/{year}/api/vouchers/",
+                query={
+                    "voucher_type": code["voucher_type"],
+                    "quantity": quantity.quantity,
+                    "sponsor_name": sponsorbenefit.sponsorship.sponsor.name,
+                },
+            )
+            if result["code"] == 200:
+                print(
+                    f"Fullfilling {code['internal_name']} for {sponsorbenefit.sponsorship.sponsor.name}: {quantity.quantity}"
+                )
+                promo_code = result["data"]["promo_code"]
+                asset.value = promo_code
+                asset.save()
+            else:
+                print(
+                    f"Error from PyCon when fullfilling {code['internal_name']} for {sponsorbenefit.sponsorship.sponsor.name}: {result}"
+                )
+    print(f"Done!")
+
+
+class Command(BaseCommand):
+    """
+    Create Contract objects for existing approved Sponsorships.
+
+    Run this command as a initial data migration or to make sure
+    all approved Sponsorships do have associated Contract objects.
+    """
+
+    help = "Create Contract objects for existing approved Sponsorships."
+
+    def add_arguments(self, parser):
+        parser.add_argument("year")
+
+    def handle(self, **options):
+        year = options["year"]
+        generate_voucher_codes(year)
diff --git a/sponsors/tests/test_management_command.py b/sponsors/tests/test_management_command.py
new file mode 100644
index 000000000..100daad2a
--- /dev/null
+++ b/sponsors/tests/test_management_command.py
@@ -0,0 +1,54 @@
+from django.test import TestCase
+
+from model_bakery import baker
+
+from unittest import mock
+
+from sponsors.models import ProvidedTextAssetConfiguration, ProvidedTextAsset
+from sponsors.models.enums import AssetsRelatedTo
+
+from sponsors.management.commands.create_pycon_vouchers_for_sponsors import (
+    generate_voucher_codes,
+    BENEFITS,
+)
+
+
+class CreatePyConVouchersForSponsorsTestCase(TestCase):
+    @mock.patch(
+        "sponsors.management.commands.create_pycon_vouchers_for_sponsors.api_call",
+        return_value={"code": 200, "data": {"promo_code": "test-promo-code"}},
+    )
+    def test_generate_voucher_codes(self, mock_api_call):
+        for benefit_id, code in BENEFITS.items():
+            sponsor = baker.make("sponsors.Sponsor", name="Foo")
+            sponsorship = baker.make(
+                "sponsors.Sponsorship", status="finalized", sponsor=sponsor
+            )
+            sponsorship_benefit = baker.make(
+                "sponsors.SponsorshipBenefit", id=benefit_id
+            )
+            sponsor_benefit = baker.make(
+                "sponsors.SponsorBenefit",
+                id=benefit_id,
+                sponsorship=sponsorship,
+                sponsorship_benefit=sponsorship_benefit,
+            )
+            quantity = baker.make(
+                "sponsors.TieredBenefit",
+                sponsor_benefit=sponsor_benefit,
+            )
+            config = baker.make(
+                ProvidedTextAssetConfiguration,
+                related_to=AssetsRelatedTo.SPONSORSHIP.value,
+                _fill_optional=True,
+                internal_name=code["internal_name"],
+            )
+            asset = config.create_benefit_feature(sponsor_benefit=sponsor_benefit)
+
+        generate_voucher_codes(2020)
+
+        for benefit_id, code in BENEFITS.items():
+            asset = ProvidedTextAsset.objects.get(
+                sponsor_benefit__id=benefit_id, internal_name=code["internal_name"]
+            )
+            self.assertEqual(asset.value, "test-promo-code")

From 53487cdba0a505cde7e2669b8547d24f6e5c8f3f Mon Sep 17 00:00:00 2001
From: Ee Durbin 
Date: Fri, 27 Jan 2023 16:18:44 -0500
Subject: [PATCH 014/112] updates to sponsor contract template (#2237)

closes #2235
closes #2236
---
 .../sponsors/admin/contract-template.docx     | Bin 14878 -> 15061 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/templates/sponsors/admin/contract-template.docx b/templates/sponsors/admin/contract-template.docx
index 0422b7cd1737b7d4fa488812621a2e5d8052c4be..6316a3eb18f1d361e5e2894ec8074796df09e312 100644
GIT binary patch
delta 13298
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
Vg!*5TRA*0o;39_r;ryrd{{yRiI<^1+

delta 13098
zcmZX*19TwG7Bw1AY}?Mn=ESyb+nkOy!NfKv&cwED+vddh=ezg4^}hT5UaPvh*4f=%
zYgeB-)z$kfxMjN{D$0OEpo2g|LxUhD$EwsK5`aSdbCSRaN&nZdyq5C~*(EAbT
zeWB(sA-D95@23{u)4BMnxY1hN;rs5>7LA~ax^>xdbiZCrncx@qMW;qS$y-*FkrdQY
z%Urs8aNmp>PJ-N#+LiKFxi1yJJ5I_wNwUw(YG)=Hik{XnfO9rRhLzGrw2#Kk86m`x
zzj``bH@Ok{I1kWMBHK^V1dT2@PRH~oMWePf!%m-!!)IV!(Mpe=unCe?9?k=aj`>Yk
zK*bQqus-mG-KCfwoe*9(vC*_-lXn5eqfO6Ysk*2W5Z^jPn)*|kH@i?q{*#THqqhh$
z;3wp!Kj(q=VFTdNl^VwuV~iV{EczTR8!VP)gOmnbw8%BYo$hxD}wz9@g=;P;G$YiTUlO?`DB#|*P=HuMv~zIl4E
zEnLj4vNb9%>q^TD{NrJ2y%NcX_L^$ve`tbI_2#GkpcaI3Y5x>Fm2
z*xVwLbx_`A{4y?M^TL1THA`b8=iSD(rE0DSo4@5<6NqMHaCJx=Z{pX`+o
zZIdM)17g~OfpEuW5(vmqAEUz9s~C1jm>TpD-BV&uT=XD3>Xy-B-D4pj1PfB
zoTH0tQ+>|Qo!(L=7UbN^7QUc$E~aY9s%9PI~w3VgZ@Lckh(sg@|SAq|5E*LrY#}n|LX!m
zkQ9LZ925G`l~*J!Dwb}=v+k0Z3>7(>6*LL?Ab4}toc0sh@2upFTV+1XYX7}ry)ll2
z2^ukppMfdfuyC>e6{L;Aa3qiqD_Am7jxzPrwK-K?mN09F49kR5ol
zO@{c*gZ+g8S~H3)(!3=ER~X7UwL^wPT4i7>#W8^Tr-(jru?aU8I`zBC_&Wwxov>qg
z;e1-+lM-^2FD%pDDGT47bkA(-Ak2WG@ukL-g~kcL?s_d9P5_yMYCI#7Bu%obGB!*`YcVrpe~p`0?~-yRNv729tN)H
zDA`~2$J@w@Z}qWz{K=fb)ELXumHC2j&K^(h*+#CzTGYk9Pjeb6wZ_@WZbB(k(N#5J
z6NSv_$ywmo>EXTcr#+52D?wSADl_2M0%B{QJwG9>vc$ReA&=`G%61BGwT?4e$XZyE
zMMB^fdSAg>xc8YlzjcQOu;IGHttbGx`>Y~Tk_NHAk
z!z|595a>6noB@?EL^b}Ks}csidwa{mBNZ~p@EwG0p`ePw&u*`vd->`nc+Q?JKh
zA4QRHId5~16xj1V+rIz}y<&FV9i{K}y91TmEzb&^36=vg+C45V5%%hnkshm1*##*s
zth(y$N_3v~F=G>$S~rt_&39t0HzN`9=Tij6G}
z;(sPeJ8>2`3tr6UZ=jd{bKG(eXWrvqxm;5B5qDKk+TyKfPr>BR#?+eK9hx(iS?#DE
zyqt~SU;~bRbd50n<4BH5T&B3-ARwI7{~5FX?MS)MWWcjMo<#a5kdvRQ2aX!r>N_m4
zxT!|Ytuz>iAQj-j#LE=9A@)1pTth*v$#RgcyP8?(@X9aN4_$ENyM!7MpDjh)Mezox
zIeq+w+jkGYt?G|=LH$@Xr(YFwlz#1vZ4Gsls<>&IC4ECSf?0wazBQD(U*|L_Db-?^
zibpHohkyj&`EjIRS#&_NsKp;s`Ei&}pU(DWSd5H4+1{ms%qA0OKO+uDkR>P}Ch^l^
zqRWV=I{KE+r@rIDV3j3JdZ#I%)+DV@f_ME;1JTc5t;xgvp|Mih6miduEURUD_2BiT
z3!iGIWyH-p3mea3QFN4BGu)~7J*G&0%-r3h3Sc&}E%7C5lb@uJr7&o)W$luxgu#^W^MO0r2RUXP6}5UU2rz;PJba5w-aerQ{b0%>?@5{
z4b|ZD7#nTvKJneaM^bR_c;<$QUHt*g5W-S&`*<-Mgz;XEZvbF@>B36>;2tZ9KuwTH
z0a(1+-2?077aMOFb!*-$^;Q6zbxn^*kAyLUx;8couio2tG#5
zSOQymnj+*EtOEAprw7wN4{uhpItbpTHEK>_w}OzIf70nR=FMT}s0Xco+Wv7w{~#Q3
zm5lEed~-n;M+W7j9oy2*b|kf;zOR$!1OT2sgQoYXwS(5>Rk{b73b0AFR>`v=8;j9X
zP`CD+)>~GEoX^khn{fb!e*@9xW-K7%{j!5Boo_TJv%~Yd^TXTy`Rg8*@n_pyK><;$
z{NznUX3m}y5W&kky?8KHTIA#NXyMW1aI0kE@Cx^^?Q#C-V3Vu!fni>GcNIGY^oKp4
zc_6)*hel`zxZ`nv(TJ_cG(3n_9FbAjn`aW4Ic;^ky8)I-!WqXKYd|9)#u@A$s2Um>
zBJV=hU5IXiLzf2yj&bm!4095U1FieQ>Ck;x|6HzlXgzk|{`0I>J4|aU(x??rLt_Da
zPJ@vi?7c6?eDEG}*rPY_c
zi<26_N!3KNO7gUZb)=pSHV9$xbb4@AThxmbxsJAsR!Im%;hSy=kDBPV9yqw1X{`5b
z328*UAZLi1wFNGMSYdX
zKuIGv8i15R7;6JFCdAaFTl!7${r5sk!QIDn$wsK)x#7k*cIWoR=j@(riNu$oqt~fP
zZE~#__g9&cGDgAS+uK*5V6NbuBW?jTBUeM)8dt7Tw{ugqdVvf4%9OlvlDYV66v3$K
z=Pp5C!5&(zi^tt$N0`SIzi$l*CD~pgwoRCX+A{pI-S$qDT$T5e1mYpoD?$GQT~U2osa6fz4oftR=Y(k04;uKj!2lG4qr
z7z`r!P!sv}ojj8FSR=Y8bKQMNv7E1Jv`*)in3BsA%Q=8^Fq}SmO~Pno9y7BaqzNtc
z{^D^&kgK|wv;{swL1MaOIa~hpqG@4)l2>P>6yc1RHDv@48Akg+A|N1E@a5VNqb~9K
z&A~9fUv{0$DZ!Y5Velmn1VtIU(?tbUQmm@=P3{=!>B_=#}}Rt~K8p#GaJ#WrcKz
z3U|80GqlY8i(z5(QP?`O)leavO$Jv*xLCYll0uy7YJbv?jvNML8rDmsR>u95?NDXc
z`5~FJmYm@w5@qe|GjOa$0(5l61K!jSWL(l@Fc0Zs8ZN0?=eULUbTkaG`tdarue{_i
zLyaAv0su9uKVJr{P++bS@iV~oEAi5#BDcK!$RC;nVtrO%`WoT--lY+LmO&j{wB){<
zDzMCywbvvu>2~-22_onCwk?xImANCYlqDl??c9)(R|m(f%Kl5^h>GM6{|%NAE-!5%
z&VE-XsSNZuBsrpy3NNc?aiml%*a`jv5~?j&4<<&~)7OU0c(qBPp{8xSbXbooJ-v
zheJSv(dPIMS&kwBDdz=k`dNtZ4DcLHmMatB
zcFjZmH^sHAM9oXtAyIwASuze}0LHu0`1C9aGLx3p7b;Z#MegkJLdp&FQ}*jr5i;T%
zw9qiPCn~USWNzB!C1jU#ZeEFAUiDFGaTEb$WHz%Wsaj|)8Wl@$J>KPtP*5_hil|MK
zF~@OFa>XD0Oap3A2Cn&caSBn7C1Ga34b{2I#sl2z#rt7pq%%`vFslCHww6y9Cp)*2
zjNek<>Nc{eW9|ui*($^h+~yxH8COdNXdr2j3Hph{wFU9BJQj@-8B0l?fp`Rbpfx)3
zxCa|D(oM|}w;+jG2oVV_cH7!L)kKSB@-?nZHjq^)bj%{Xf2qU#uFcH^~
z)yaxhb$XdN)+>$K~U&F73MzLZ$iTsTd1j8LFYSdrW|H(=37;H>TO
zjW1fEc^7Ba)l)!n%nXdzqH6EHZ&VqQuw*?#Xa--%X(;BJitYo)YF7Z8L-72}TnNPvvr@J~F75l?=_IU-D&dgLGjT#JnsC
zQH?!fWntW^+mdi+yQlb9G_CrZJ_9BfvsmDW)lPY
z=B#_5475YCHR==)mM>|>EfBI307{=^Gkn2tgQi^Nopqv!Z#34T
zqyQeC3UXMm3qqa+3fKAg?s$N0OmTOZkOfw+!0gQ)yAS@BeuhpH6gUBzV{Gqj3Y-FW
zj<4R$3+SVzj}J?ltr?q7D?Euy(1j%^j_nfV%X5S=c!Uw}@Xblj)mkwxUA^22y1QAq
zV-0uhDq9dRfw5djC}vzoKZAlR{wIjlS;=Cz^3+1nuEJ^tS24xbQq4&Zc78E!GlRw#
zKB`;SS1Kx6uVj`d%o;_GkQQeTtTp+h8NA&WN|FFUpyrheg@x=(A=QiP-^d|zLy_u>
zYXQ&k^fM+0{sqDrIugN?_UI0wWXRAjs3(;U*i`~NKn6n!Ou~NtKv$Nhl@IxNXNj8<
zx6p_89QrkN(9wuoUxz^QO2{9(^Zl7JV#Oi?Lql@zd&d!s7IoasW_<&G7v;)*-@z^48w2CA@0<_h2<-lIkA6
z`ZPQ6DQAs|t;;jvOw6aySt=;}rzeh9r09^&A)-W?Duh8{%uI2!HV32udJ97;=0_q8
zGAw$VCL@dQ$>t=3t%Ege8?{lpjOeB4fUx>o&;0=0-gL7~#&7#XE|5HApD17CGYf2w
z!=a0_uHX5wR6!HFjQ1QiCzO7WEXMxCRcQ(U7;#BMaRSOZ`)r!5cjnTf31qf7ZWn13
z0)|RALtMfn$mOy%Or+3(kdZ6i$zf4_Du0oV1qNCs$dHuG(9{_-p|hFmgO(CwxP7wH
zUR)O_sgj5xDiQhwO-Q&<8+N?mw_GAODre$>2)d8{MyB&K-)M9GtYc0D%zz
zRe*3`NBe4&sD
z;DdzMMDT0JhW5@gQF>VE*yxZn4F(qmCe7!mU33o_txP~U(TJ{KeBnQw4vZg!(UbUL
zhd^8LO_T7b*U&zi)epG?_k;N2*dHeriS~cfee&gpChLou$RSsZ!5zH(QoE}kC9?P$
zzki@zL`?!CGHwZl7F43LSABEVFG(ei*?Wy+s*LBr!d~lubXaGXbHGX_+uk_{fN!&@
z6KVuP3Wq%I)5S;SVPKG_a
zP8E%*pet}JlO=(*Y)H&179Hew=OmFa0w4GD7R9lk9!rX?u1!jJUD)vLIa}p+Ht{H<
z>Y&Lot7k6?O66$ktr^FR#QPJcE;e^^clZW
z4;%8jdY&c=!`G8f-&0aKH!=#gq8wDp)Yn`p2FW7zFy1G(QrnR9^w0O+igZ&&jIGq>o2FD$loN*%d+ZAiEnzbGpcnUXi2hjh7XLnTfu+?R
zf0Y6U=Kgb|pPT~BOlgNqWJp+K@|0N%2-^t=FH`_{|zTfN&SrcBxGrhqx
zGRkAv1(y%VbP4XihLR*=KO_7|ojCW`+u6siv!(7JYK=8rCeLzFW8R`mqmwtwDtJ>Y
zVUkKYqh@RR69S-O8Nxpd%PrABj!=J9=oYQVr!b+z9ZKf1GA+I9rm4+gNpy8&HE(e^
znLR?l3LGW0-h*(@QJe_wc>*(M!!*FuNJoYqts%|2Eup*7=3mplcGjowXh}TE371_7Bb7w|8^}N6+#RP-!W-+Ktyt~
z4il10AVO}ea|y-Bv9I~sq8c$$ws+|@7^xO|X^_5$S>i-oNeI+C|NrtqxAcx|ND#pJqCm=bg(Wf}!MA^_tXj-T%n9
z?-&8Ce;TQGE~d$9>D<7!Jkq-ixzF@EyC5np)x)~DY~P@e{7#V)0X}sw*vK&L2R0VF
zCg@`$t2VjQy(kPpfx6#t+$cB^>u(o0412Vg$^h`r;#^N6J4BP{99c{cw+JnS;ajQo
z!XT$cE^0iB{t_o|R}N(TV$W{3EUEwaJ0a{B|Da^S=FcEi!fb0Wo_-v7Pv=wl)07^C
zPHlusq@thIOXWGB(@Sc@0`xs0=Eo;EV@a`(xU2?TEuF@>&yl|Qk-j`ub5a>*v*wwn
z0Wp9&Wg!O~n??Ac6RK@u6nv@?nbpvyYO!b*;o62L8Aj3mkf9Z_$^B_3#xt9UEXZk+
z+7t;1v2-D!id~7zlP&#F<|q-p4Uh9{OL&-xy?^)7EuYedi`%_=6Sgz9Xjw7hIT&;9
zw_K;~e(yhA0BB=K1Y65XrnzKMud8U-2RM+*>!tN7I|Ei<%$Av_N#hE}&5H>aV>E?#cLUpJ4
zzL8)(-`XeRg`zz10#e+;seae}VO&q%^68TJWP)CQ_Dw?Dqdur;8K3~O2|3i>
zK{mD_j+NP`3!L%_iLBX{Z!0q=nOkC*0o%YZpkC;jy93%fe9u
zd+NW&zfBmlDz&WNER`HE#-^VJ{AMZdIm_;8;F8c3hL^W){5$wQ6l7X>H_fBu_BolEVRjxvBwa*>M+d!50A{Yr^AbDJFb#2(4z}lZQNt5DJB@6KhVjx{zo%10J
zW?gvrv;_KSxd?pL(=8IM`_zzJUTtprUOPHeuT8&%HrgIxQayTUxEw~AfI>WNVEBVf
zji7!`!4~=@6WgS28Sn#MRl)5y^6Dox9ff?dtvu-KN0WB?9R!dF@wsN4=!~jWvv6eD
zBT`MVbj`7CNbc_aNal%=B|5uPv~p^E7+aJnPE8qf%^4OUlNe8$9&H;sJsUpEvk_5h
z@zM3?5m>Lrk2{x>S(78$GZz)yT4zm$Df?-vtOeG4r>i1cQ{Z*ARzy2YMpwcl!lcLEiwd1@c5U1n6tUWIo0BZ(8UmCVwCn
zVqQm~s$L!z5L5y*8pzsb3g3Qd5h|(MEb%-hZRloipS7j9bAkSbK0vyO##8}l_Lrn`
zwi@1-s)Snh+Ux-%NNEijh2Iyv;J?HDb#g{VICsN(t+CEZ?cDy{F)b9$mn-rluQx?%
z%qJ#IaPOGI_vZyxQ!H9*cnXPF?J2TFhl@r$Ku(13Cup^QP|DO0w{=RxBUE1tSkOlg
z-X0hg^y4uu&|bq52sd^gxJRK14?GKNcbXuDfjBUkZ~6iQFS{)nY)17+H!9MW=4^r*
zo0EOZBG*ExUl*Fya;Uc!1li*u#L%a+2B8NW2BsQ*dB3&e5F-Vn1c;fyZ#mMjfjwfp
zGglQ(%^0&eVykovOsm6~44OER_P`B$%8d1(%7Z;B2feYg=>n|o6;RCHqZCVrH+TJCG6q6PFllICa#OPR*VE149aq#zFB{{&eeyB4AjJh>VkKRd&$KNEB>Ci6P7U~JE(W1Tf`
zPbwzosnGP6Dbr;tgwyhs;Ut9-J@Z{HjK
zuZ(fywqyHG0xDey>gJFd_jxjixbcF)@aEb;9W8h^0w(T_^l|rO?$`|jVnZo}fe<@V
z`y8|8kRhDpGY;+6tPzjt&IXG)ukkURqH9u$B54a0d)ikamMYtFsC8ea`s0_{F03dY
znb8~}#}22T7~69s&QjBs2R0Swfk(s0{J4VDgJQxdj}a;WhQ=7+
z=_t6af(x?enTSC&3BG1DOryvRBQUU?8T~#MKtq&3PTQKE$_I(FFF?1WQCl{Z@5<$;CvK8)?VIYa|
za;UI$^qxPgw-4yB?SXyn{b|1t6%-~A37QtCutm9P0QD;}E^0V-X$Xo!;^gPmN?a9j
z_LnF@;Fq#o>eZ95ZFrbX^HjVEs@=EfbL`>^_&TI{6f|}F49(D*Nt6!xFka@LFHS+D
zYXr%jR>23_T_np}2P3OBk}%oJG=TvV5_O*bxgZ6-2FqbO`lOj2>vK+1y)w4|tn7kt
z+8XVLR+TeuyRhWXvV89>j<3g2)^&GFcZP|n_Jx^aE8QYA2FHl-Dcy&?P
zd71fe;IXi$#YBDaqHdMQG>ZCwpEJ6Zy*?6~Cwubw^n-pJc(X#H2sDg;#`{z@n$ir
z^9op!#L7t>tW*$SGz69T8X2#40zwp?GNUIwf}WD!F62vEIl#&wh83Iu5X*C`hD$h3
zVk{C3Ic=AR_s&DrapwCHj5v(V*^`B&AEP0Rvc2G<$k)J9Eun6f-yf4Yh-3)f4aN~QzJ5t|e
zL<1hSvluV*I3g0dOH@^Dyh!#2Ih_JdYNrw?eVhn7D>I{5vUC8z{rT}6!R7OD|90?k
z66g8yR+7;7ez$i-)q#0(iE37?ZlZ|U6FIy*zRXj#P0uIy{LwTg0mt^b4%AK1N36rX
zIFO7U|IyF-)}+gI&cRc*so^y*j@mN#&&?4I(AITo*+6PqNXQs
z1+g;OQvXaRN(6ehg6Pbzes;C_;eE#Vckfd0eFVk5ISDA0NowD1n;lK=eXe5{p&RlA
z(bId|&{2=rqF1&^rA!M~8CdwM!r5!V#!NRz)NH^Bd5P%4Vlm20T7427gu6|19(P}*
zg}vO`vbjhboOp?Qr6@`%`9ysrp4C;mC;XZZUj?;xU#T7hL8ql>>ee;L+o{P>NBNa>
zGUpnATL*}Gp(NGfOa>vTG$!LUr8X=*_6KE}xK?wL
z$P32zJ3GC#-;)uBcQ5nQttXUFAGCkoI;U|*R{$VIjbdJC#QYn67%nq8;G}5B+nS!4
z{2E4EZTUJ785{nRnEp#dtXPN2N$?dBPZS6861GJ|(q!;G$krfUs(SG(c4IdAIp@=A
zYkqZk1I);4e#i6p_&Uxd`B(
zxWzZu)p<14k!l->xdtpRAoho*%8Y^iw%i+b5`xr0C!?iXO?R4+F?%(XZZGqDw9cLX
z+~-kXQhk|Q$(>}*}#Mxj4lGC9m!HMfMLPtfYBt0OVy)=OUE39F^VNvC0L
z>?cPcQK|aed8&gG52QgAAJJR_=Kz|9$$3=JDV29NqM|nNzNB1YMe9A0(>lS(*GgUX!0Qbmz!>3rd6rX!t
zX6l+`MoEaM9MmyfQ%!n7*el<1W%lWuGxWlO_rvJ2;dW!UTP{1ton-ea5
zOD+4&Wf>L|6z&cT$!njdZ)$ZL!p_YMwg%>z__(1Aen|z?$*LV=;R
zJ6_^~^FE6Uul|C*n1Vhd<#-@UEmR6Zo
zmV_7`?DP0%Ewn<4n?L6^TD|WmnJL#=V?5Pn4_@VE$YI!69aDF=!vMh_b>R4Z5YD@4
zIN!d6ohlbQQ&;M@Ez*-E7z#rx_&>z|^E-*5?2@?m-IJ;N
zfWPqk8OKQ`1%?2C+NPnQvpa#;RiIIm*ZugJ1=iNL)uf8sx7f$A71%-gl&_%_Nc>Xs
zCu?T`M<0%<5@zqzABfmD=gO_8fnsqok|@7f?0j!Vwk(Nc3^T-Locdx~;zuZ16>C^}
zv7tx6d-37GmHjerR+E!z+!1OXFAB*|R@RYBS=oP^4QPM8++pO`B;8{+yyVR`r;sZ-
zb^GYmi0BFGW6fL%hA$+LmcZ@V@4~eY>DQ1DAJjB6izRd;YTOxC&_8Llq8g6dch%ti`-|mEX{;RvG+KA3N
zT&Z}QePi~YV)0)hzvtaSAGM40MT*a6*UG~9;w?JieIZadL9$E$fzNpp{6~>RN<4E&
zMF9d*DFzDi|C9G77=0xM)Ri1onUKG4RfpfoqbV+ssA{{Zmf8}Oi??|s=>A=0v1nAu
z?fQO1UQ7Z*SFbV#-oLey(stF!>+-!tKJ^Y-S*a(?{;}VKU^@Vs#sGdJ?A58{ibooa
z5S5Y(eglE}@pgCa**f<=G{E_qPa|kyI=VsrOLj>hHfp}SC@j7m5cd;ira2MLfxT#+)Sn*Pub7L;FAQ(!S8s#KGh&(%-6j$gHHrC_)jmBv48!A4kr0_nA
z4DT@`MfxO7fp@}}Jsv5hRQl$hrjtxMQ9~Wwx*{mLBBCtCNm`@4T3^T1K3Fkz=`7fZ
zX>(nVH)pveT^XBM0dOfYEV&yD4If#d#7^Zz_>EuF`Q2GFOAeE^rsDy8I6d9FbI3-(p!<(bjHjq+xPqut9Z3i;TfbhgqG}oc7vG1KD(l3TJYW4N?*0a8k3&
z{izw0c_c_<Y8|&Wh@{W(*yn$m#RQ7%1*8WjR6On
zzZ=9z)Id2C(2-CZoAX_(XgttdlX-chB)-S{9luMfo#e$T*^uVOu1<~xOO{>DmXpg}
zLS#B=kx#(iKvfB0M^FnNZm=J=7kv2~k7p}j;z7z0yno$T4kyubrdRaalS%o-Y3g>(
zB4*dn5hLmPIRUYZzpFO)H6M98TAqh?7R*LAa1TKY=w9G}6cufLLKDq@Bo$vavAKOR
z{8@I^WDEx-F!8G;e~@2Mj(iEqNo)Car=>=UeR9O=F$I5_-FWl9T4?`kHagh3h9N}{
zN9}7zW9wDAgYz<6*G@5*FNlHIMuV|Ci=bh=l=2oRIHhg7?4jiKKnx*zgZ1
zZrlTrh3tonVAk{BG83O#xfYL9#o9Cr7>Dado>V`gfkyR
z0IrX_X$T%j&SdIP!(?q6EgqNg0pBt@&eblljylEDzk@h|D`J>QTOx2O=
zW||gI?eeM7xCGd)g_ntU{~|OO8Y7{Fl@Q3)
zS46sic>y)w>y}>mV}0?n*uX#pw?WyV(PD7##`_hgbvH1Le_)j!tB8h)$J&=~;c%~}
z4d8%;>xbfr)XYFxvE}qQ%QHq-!o+GNab}-Cq>rbyS;=AsVWc)vtti45s-K|ZRkT;8
z3>&9K$kIzXC_vaQSUDbL%vXe0>jlo4BD3pgqdUM58mB#+{rB{#X%4{j?6S?Vz4Mls
zvzP-dV{lT|_e34hQHLEGa_lvXgL8is{}Oze9D9;Szzumh|1^W$G&8m~%R`m1J0sXs
zPFrz(c5J8z_{AEU3#c6&@7iywz#x*b9+=!Dwn}$my+1Aw@%~|loEga(6Z$Vb`G3p*
z=4&JfL1NT_vK#(4X`{}JOi2kYlTlJ0%^6zalp@@s<
zKbW0G5dW0FrklS7?cWd(orFCu(*I!oE&4_M9}H^(IXB6FF#iriDF1_rPB7&r*88VD
z|8^v#|H0fbfPi>7IGZxMxO&-|xqS7svsIJ<1w#k<|8iCS{nFt7&&5{E2|L`h#Q!|u
xAMXBN>i)MC+bjumJVgIh`pfg+f>I?|@sRwt8pDGNmdl<{#zO%m!}-sh{}1ug($N3_


From 19703a645694f90a6dec1f7efc563fa93cf517ef Mon Sep 17 00:00:00 2001
From: Ee Durbin 
Date: Wed, 15 Feb 2023 07:43:49 -0500
Subject: [PATCH 015/112] update prefix for additional discounted registration
 vouchers

---
 .../management/commands/create_pycon_vouchers_for_sponsors.py   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sponsors/management/commands/create_pycon_vouchers_for_sponsors.py b/sponsors/management/commands/create_pycon_vouchers_for_sponsors.py
index 173ec31b9..f8b99855a 100644
--- a/sponsors/management/commands/create_pycon_vouchers_for_sponsors.py
+++ b/sponsors/management/commands/create_pycon_vouchers_for_sponsors.py
@@ -30,7 +30,7 @@
     },
     148: {
         "internal_name": "additional_full_conference_passes_2023_code",
-        "voucher_type": "SPNS_EXPO_DISC_",
+        "voucher_type": "SPNS_ADDL_DISC_REG_",
     },
     166: {
         "internal_name": "online_only_conference_passes_2023_code",

From fad14cb19cf86d64e7a9d707656a892478809013 Mon Sep 17 00:00:00 2001
From: Dustin Ingram 
Date: Wed, 15 Feb 2023 10:45:43 -0500
Subject: [PATCH 016/112] Add missing migrations (#2246)

---
 pages/migrations/0003_auto_20230214_2113.py    | 18 ++++++++++++++++++
 sponsors/migrations/0093_auto_20230214_2113.py | 18 ++++++++++++++++++
 2 files changed, 36 insertions(+)
 create mode 100644 pages/migrations/0003_auto_20230214_2113.py
 create mode 100644 sponsors/migrations/0093_auto_20230214_2113.py

diff --git a/pages/migrations/0003_auto_20230214_2113.py b/pages/migrations/0003_auto_20230214_2113.py
new file mode 100644
index 000000000..af666269f
--- /dev/null
+++ b/pages/migrations/0003_auto_20230214_2113.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2.24 on 2023-02-14 21:13
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('pages', '0002_auto_20150416_1853'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='page',
+            name='content_markup_type',
+            field=models.CharField(choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text'), ('markdown_unsafe', 'Markdown (unsafe)')], default='restructuredtext', max_length=30),
+        ),
+    ]
diff --git a/sponsors/migrations/0093_auto_20230214_2113.py b/sponsors/migrations/0093_auto_20230214_2113.py
new file mode 100644
index 000000000..853d14606
--- /dev/null
+++ b/sponsors/migrations/0093_auto_20230214_2113.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2.24 on 2023-02-14 21:13
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('sponsors', '0092_auto_20220816_1517'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='sponsorshipbenefit',
+            name='package_only',
+            field=models.BooleanField(default=False, help_text='If a benefit is only available via a sponsorship package and not as an add-on, select this option.', verbose_name='Sponsor Package Only Benefit'),
+        ),
+    ]

From b12479f3c9c04b22a20c9e1f096d194b2ae707b8 Mon Sep 17 00:00:00 2001
From: Dustin Ingram 
Date: Wed, 15 Feb 2023 10:46:37 -0500
Subject: [PATCH 017/112] Add support for Sigstore bundle files (#2247)

---
 downloads/api.py                               |  2 +-
 .../0009_releasefile_sigstore_bundle_file.py   | 18 ++++++++++++++++++
 downloads/models.py                            |  3 +++
 downloads/serializers.py                       |  1 +
 downloads/templatetags/download_tags.py        |  5 ++++-
 templates/downloads/release_detail.html        |  8 ++++++--
 6 files changed, 33 insertions(+), 4 deletions(-)
 create mode 100644 downloads/migrations/0009_releasefile_sigstore_bundle_file.py

diff --git a/downloads/api.py b/downloads/api.py
index bb49e588e..e58023dbf 100644
--- a/downloads/api.py
+++ b/downloads/api.py
@@ -69,7 +69,7 @@ class Meta(GenericResource.Meta):
             'creator', 'last_modified_by',
             'os', 'release', 'description', 'is_source', 'url', 'gpg_signature_file',
             'md5_sum', 'filesize', 'download_button', 'sigstore_signature_file',
-            'sigstore_cert_file',
+            'sigstore_cert_file', 'sigstore_bundle_file',
         ]
         filtering = {
             'name': ('exact',),
diff --git a/downloads/migrations/0009_releasefile_sigstore_bundle_file.py b/downloads/migrations/0009_releasefile_sigstore_bundle_file.py
new file mode 100644
index 000000000..52383852c
--- /dev/null
+++ b/downloads/migrations/0009_releasefile_sigstore_bundle_file.py
@@ -0,0 +1,18 @@
+# Generated by Django 2.2.24 on 2023-02-14 21:14
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('downloads', '0008_auto_20220907_2102'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='releasefile',
+            name='sigstore_bundle_file',
+            field=models.URLField(blank=True, help_text='Sigstore Bundle URL', verbose_name='Sigstore Bundle URL'),
+        ),
+    ]
diff --git a/downloads/models.py b/downloads/models.py
index 7955f58f5..6d91534ac 100644
--- a/downloads/models.py
+++ b/downloads/models.py
@@ -329,6 +329,9 @@ class ReleaseFile(ContentManageable, NameSlugModel):
     sigstore_cert_file = models.URLField(
         "Sigstore Cert URL", blank=True, help_text="Sigstore Cert URL"
     )
+    sigstore_bundle_file = models.URLField(
+        "Sigstore Bundle URL", blank=True, help_text="Sigstore Bundle URL"
+    )
     md5_sum = models.CharField('MD5 Sum', max_length=200, blank=True)
     filesize = models.IntegerField(default=0)
     download_button = models.BooleanField(default=False, help_text="Use for the supernav download button for this OS")
diff --git a/downloads/serializers.py b/downloads/serializers.py
index f30974e02..67bde5b5c 100644
--- a/downloads/serializers.py
+++ b/downloads/serializers.py
@@ -48,4 +48,5 @@ class Meta:
             'resource_uri',
             'sigstore_signature_file',
             'sigstore_cert_file',
+            'sigstore_bundle_file',
         )
diff --git a/downloads/templatetags/download_tags.py b/downloads/templatetags/download_tags.py
index a6df103e9..fb3496787 100644
--- a/downloads/templatetags/download_tags.py
+++ b/downloads/templatetags/download_tags.py
@@ -10,4 +10,7 @@ def strip_minor_version(version):
 
 @register.filter
 def has_sigstore_materials(files):
-    return any(f.sigstore_cert_file or f.sigstore_signature_file for f in files)
+    return any(
+        f.sigstore_bundle_file or f.sigstore_cert_file or f.sigstore_signature_file
+        for f in files
+    )
diff --git a/templates/downloads/release_detail.html b/templates/downloads/release_detail.html
index 386bd795d..b68b69a66 100644
--- a/templates/downloads/release_detail.html
+++ b/templates/downloads/release_detail.html
@@ -65,8 +65,12 @@ 

Files

{{ f.filesize }} {% if f.gpg_signature_file %}
SIG{% endif %} {% if release_files|has_sigstore_materials %} - {% if f.sigstore_cert_file %}CRT{% endif %} - {% if f.sigstore_signature_file %}SIG{% endif %} + {% if f.sigstore_bundle_file %} + {% if f.sigstore_bundle_file %}.sigstore{% endif %} + {% else %} + {% if f.sigstore_cert_file %}CRT{% endif %} + {% if f.sigstore_signature_file %}SIG{% endif %} + {% endif %} {% endif %} {% endfor %} From 240865e4f70cb54cced53a36c3df1557431de3f3 Mon Sep 17 00:00:00 2001 From: Dustin Ingram Date: Wed, 15 Feb 2023 10:58:04 -0500 Subject: [PATCH 018/112] Add a check in CI for missing migrations (#2248) --- .github/workflows/ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f34cc73bb..97298ffca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,6 +35,11 @@ jobs: run: | pip install -U pip setuptools wheel pip install -r dev-requirements.txt + - name: Check for ungenerated database migrations + run: | + python manage.py makemigrations --check --dry-run + env: + DATABASE_URL: postgres://postgres:postgres@localhost:5432/pythonorg - name: Run Tests run: | python -Wd -m coverage run manage.py test -v2 From 2ce244285bf4e3e044667e42bfea1fbb5119633e Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Thu, 16 Feb 2023 09:42:24 -0500 Subject: [PATCH 019/112] sponsorship: allow admins to temporarily unlock finalized sponsorships for editing (#2249) --- sponsors/admin.py | 18 ++++++++- .../migrations/0094_sponsorship_locked.py | 32 ++++++++++++++++ sponsors/models/contract.py | 1 + sponsors/models/sponsorship.py | 15 +++++++- sponsors/views_admin.py | 38 +++++++++++++++++++ .../admin/sponsorship_change_form.html | 14 ++++++- templates/sponsors/admin/unlock.html | 35 +++++++++++++++++ 7 files changed, 150 insertions(+), 3 deletions(-) create mode 100644 sponsors/migrations/0094_sponsorship_locked.py create mode 100644 templates/sponsors/admin/unlock.html diff --git a/sponsors/admin.py b/sponsors/admin.py index f5108bdc7..aa3d5408e 100644 --- a/sponsors/admin.py +++ b/sponsors/admin.py @@ -489,7 +489,7 @@ def get_readonly_fields(self, request, obj): "get_custom_benefits_removed_by_user", ] - if obj and obj.status != Sponsorship.APPLIED: + if obj and not obj.open_for_editing: extra = ["start_date", "end_date", "package", "level_name", "sponsorship_fee"] readonly_fields.extend(extra) @@ -554,6 +554,16 @@ def get_urls(self): self.admin_site.admin_view(self.list_uploaded_assets_view), name=f"{base_name}_list_uploaded_assets", ), + path( + "/unlock", + self.admin_site.admin_view(self.unlock_view), + name=f"{base_name}_unlock", + ), + path( + "/lock", + self.admin_site.admin_view(self.lock_view), + name=f"{base_name}_lock", + ), ] return my_urls + urls @@ -677,6 +687,12 @@ def approve_signed_sponsorship_view(self, request, pk): def list_uploaded_assets_view(self, request, pk): return views_admin.list_uploaded_assets(self, request, pk) + def unlock_view(self, request, pk): + return views_admin.unlock_view(self, request, pk) + + def lock_view(self, request, pk): + return views_admin.lock_view(self, request, pk) + @admin.register(SponsorshipCurrentYear) class SponsorshipCurrentYearAdmin(admin.ModelAdmin): diff --git a/sponsors/migrations/0094_sponsorship_locked.py b/sponsors/migrations/0094_sponsorship_locked.py new file mode 100644 index 000000000..c1c6a8152 --- /dev/null +++ b/sponsors/migrations/0094_sponsorship_locked.py @@ -0,0 +1,32 @@ +# Generated by Django 2.2.24 on 2023-02-16 13:55 + +from django.db import migrations, models + +from sponsors.models.sponsorship import Sponsorship as _Sponsorship + +def forwards_func(apps, schema_editor): + Sponsorship = apps.get_model('sponsors', 'Sponsorship') + db_alias = schema_editor.connection.alias + + for sponsorship in Sponsorship.objects.all(): + sponsorship.locked = not (sponsorship.status == _Sponsorship.APPLIED) + sponsorship.save() + +def reverse_func(apps, schema_editor): + pass + + +class Migration(migrations.Migration): + + dependencies = [ + ('sponsors', '0093_auto_20230214_2113'), + ] + + operations = [ + migrations.AddField( + model_name='sponsorship', + name='locked', + field=models.BooleanField(default=False), + ), + migrations.RunPython(forwards_func, reverse_func) + ] diff --git a/sponsors/models/contract.py b/sponsors/models/contract.py index 3b22de9f3..3cbf389e2 100644 --- a/sponsors/models/contract.py +++ b/sponsors/models/contract.py @@ -248,6 +248,7 @@ def execute(self, commit=True, force=False): self.status = self.EXECUTED self.sponsorship.status = Sponsorship.FINALIZED + self.sponsorship.locked = True self.sponsorship.finalized_on = timezone.now().date() if commit: self.sponsorship.save() diff --git a/sponsors/models/sponsorship.py b/sponsors/models/sponsorship.py index ec22f61f1..8e1d13a63 100644 --- a/sponsors/models/sponsorship.py +++ b/sponsors/models/sponsorship.py @@ -161,6 +161,7 @@ class Sponsorship(models.Model): status = models.CharField( max_length=20, choices=STATUS_CHOICES, default=APPLIED, db_index=True ) + locked = models.BooleanField(default=False) start_date = models.DateField(null=True, blank=True) end_date = models.DateField(null=True, blank=True) @@ -211,6 +212,12 @@ def __str__(self): repr += f" [{start} - {end}]" return repr + def save(self, *args, **kwargs): + if "locked" not in kwargs.get("update_fields", []): + if self.status != self.APPLIED: + self.locked = True + return super().save(*args, **kwargs) + @classmethod @transaction.atomic def new(cls, sponsor, benefits, package=None, submited_by=None): @@ -287,6 +294,7 @@ def reject(self): msg = f"Can't reject a {self.get_status_display()} sponsorship." raise InvalidStatusException(msg) self.status = self.REJECTED + self.locked = True self.rejected_on = timezone.now().date() def approve(self, start_date, end_date): @@ -297,6 +305,7 @@ def approve(self, start_date, end_date): msg = f"Start date greater or equal than end date" raise SponsorshipInvalidDateRangeException(msg) self.status = self.APPROVED + self.locked = True self.start_date = start_date self.end_date = end_date self.approved_on = timezone.now().date() @@ -320,6 +329,10 @@ def rollback_to_editing(self): self.approved_on = None self.rejected_on = None + @property + def unlocked(self): + return not self.locked + @property def verified_emails(self): emails = [self.submited_by.email] @@ -353,7 +366,7 @@ def added_benefits(self): @property def open_for_editing(self): - return self.status == self.APPLIED + return (self.status == self.APPLIED) or (self.unlocked) @property def next_status(self): diff --git a/sponsors/views_admin.py b/sponsors/views_admin.py index f68025bf9..8968da1b7 100644 --- a/sponsors/views_admin.py +++ b/sponsors/views_admin.py @@ -182,6 +182,44 @@ def rollback_to_editing_view(ModelAdmin, request, pk): ) +def unlock_view(ModelAdmin, request, pk): + sponsorship = get_object_or_404(ModelAdmin.get_queryset(request), pk=pk) + + if request.method.upper() == "POST" and request.POST.get("confirm") == "yes": + try: + sponsorship.locked = False + sponsorship.save(update_fields=['locked']) + ModelAdmin.message_user( + request, "Sponsorship is now unlocked!", messages.SUCCESS + ) + except InvalidStatusException as e: + ModelAdmin.message_user(request, str(e), messages.ERROR) + + redirect_url = reverse( + "admin:sponsors_sponsorship_change", args=[sponsorship.pk] + ) + return redirect(redirect_url) + + context = {"sponsorship": sponsorship} + return render( + request, + "sponsors/admin/unlock.html", + context=context, + ) + + +def lock_view(ModelAdmin, request, pk): + sponsorship = get_object_or_404(ModelAdmin.get_queryset(request), pk=pk) + + sponsorship.locked = True + sponsorship.save() + + redirect_url = reverse( + "admin:sponsors_sponsorship_change", args=[sponsorship.pk] + ) + return redirect(redirect_url) + + def execute_contract_view(ModelAdmin, request, pk): contract = get_object_or_404(ModelAdmin.get_queryset(request), pk=pk) diff --git a/templates/sponsors/admin/sponsorship_change_form.html b/templates/sponsors/admin/sponsorship_change_form.html index bb8114231..9d7bcce85 100644 --- a/templates/sponsors/admin/sponsorship_change_form.html +++ b/templates/sponsors/admin/sponsorship_change_form.html @@ -1,5 +1,5 @@ {% extends "admin/change_form.html" %} -{% load i18n admin_urls %} +{% load i18n admin_urls admin_modify %} {% block object-tools-items %} {% with original as sp %} @@ -39,6 +39,18 @@ Uploaded Assets + {% if sp.unlocked and sp.status != sp.APPLIED %} +
  • + Lock +
  • + {% endif %} + + {% if sp.locked and sp.status == sp.FINALIZED %} +
  • + Unlock +
  • + {% endif %} + {% endwith %} {{ block.super }} diff --git a/templates/sponsors/admin/unlock.html b/templates/sponsors/admin/unlock.html new file mode 100644 index 000000000..bca6c853d --- /dev/null +++ b/templates/sponsors/admin/unlock.html @@ -0,0 +1,35 @@ +{% extends 'admin/base_site.html' %} +{% load i18n static sponsors %} + +{% block extrastyle %}{{ block.super }}{% endblock %} + +{% block title %}Unlock Finalized Sponsorship {{ sponsorship }} | python.org{% endblock %} + +{% block breadcrumbs %} + +{% endblock %} + +{% block content %} +

    Unlock Finalized Sponsorship

    +

    Please review the sponsorship application and click in the Unlock button if you want to proceed.

    +
    +
    +{% csrf_token %} + +
    {% full_sponsorship sponsorship display_fee=True %}
    + + + +
    + +
    + +
    +
    +
    {% endblock %} From 49a1e2a4c5f68d809d64f1837241b22d57322ed1 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Mon, 6 Mar 2023 07:38:42 -0500 Subject: [PATCH 020/112] bump rate limit for api --- pydotorg/settings/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pydotorg/settings/base.py b/pydotorg/settings/base.py index d5eb568a6..22a8ae71e 100644 --- a/pydotorg/settings/base.py +++ b/pydotorg/settings/base.py @@ -309,7 +309,7 @@ ), 'DEFAULT_THROTTLE_RATES': { 'anon': '100/day', - 'user': '1000/day', + 'user': '3000/day', }, } From 88d42f786f857a30ab3e29fffd39a2e05e9d2f62 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Sat, 18 Mar 2023 08:19:52 -0400 Subject: [PATCH 021/112] sponsorship form: fix rendering of application form When benefits are configured for packages that are to the right of packages that *do not* have a benefit, we should correctly render. This was effectively "gravity left" for the icons on the application. --- templates/sponsors/sponsorship_benefits_form.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/sponsors/sponsorship_benefits_form.html b/templates/sponsors/sponsorship_benefits_form.html index 9b35a9ff8..309bac057 100644 --- a/templates/sponsors/sponsorship_benefits_form.html +++ b/templates/sponsors/sponsorship_benefits_form.html @@ -96,7 +96,7 @@

    {{ benefit.name }}

    {% for package in form.fields.package.queryset %}
    - {% if forloop.counter <= benefit.num_packages %} + {% if benefit in package.benefits.all %} Date: Tue, 21 Mar 2023 05:13:25 -0400 Subject: [PATCH 022/112] enable customizing admin (#2263) psf staff spend a lot of time between us.pycon.org and python.org django admin this enables configuration of a different theme for python.org so its easier to differentiate. thanks to @swiencks for pointing out how easy to confuse they are. --- base-requirements.txt | 5 ++++- pydotorg/settings/base.py | 15 ++++++++++++--- pydotorg/settings/heroku.py | 12 ------------ templates/admin/base_site.html | 2 +- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/base-requirements.txt b/base-requirements.txt index 4832f0ee6..b19aacc93 100644 --- a/base-requirements.txt +++ b/base-requirements.txt @@ -1,11 +1,14 @@ dj-database-url==0.5.0 django-pipeline==2.0.6 django-sitetree==1.17.0 +django-apptemplates==1.5 +django-admin-interface==0.24.2 +django-translation-aliases==0.1.0 Django==2.2.24 docutils==0.12 Markdown==3.3.4 cmarkgfm==0.6.0 -Pillow==8.3.1 +Pillow==9.4.0 psycopg2-binary==2.8.6 python3-openid==3.2.0 python-decouple==3.4 diff --git a/pydotorg/settings/base.py b/pydotorg/settings/base.py index 22a8ae71e..4bd30b408 100644 --- a/pydotorg/settings/base.py +++ b/pydotorg/settings/base.py @@ -94,8 +94,12 @@ 'DIRS': [ TEMPLATES_DIR, ], - 'APP_DIRS': True, 'OPTIONS': { + 'loaders': [ + 'apptemplates.Loader', + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + ], 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.i18n', @@ -151,10 +155,14 @@ 'django.contrib.redirects', 'django.contrib.messages', 'django.contrib.staticfiles', + 'django.contrib.humanize', + + 'admin_interface', + 'colorfield', 'django.contrib.admin', 'django.contrib.admindocs', - 'django.contrib.humanize', + 'django_translation_aliases', 'pipeline', 'sitetree', 'imagekit', @@ -288,7 +296,8 @@ ### SecurityMiddleware -X_FRAME_OPTIONS = 'DENY' +X_FRAME_OPTIONS = 'SAMEORIGIN' +SILENCED_SYSTEM_CHECKS = ["security.W019"] ### django-rest-framework diff --git a/pydotorg/settings/heroku.py b/pydotorg/settings/heroku.py index 5adff485c..4a0e4cc35 100644 --- a/pydotorg/settings/heroku.py +++ b/pydotorg/settings/heroku.py @@ -20,18 +20,6 @@ } } -HAYSTACK_SEARCHBOX_SSL_URL = config( - 'SEARCHBOX_SSL_URL' -) - -HAYSTACK_CONNECTIONS = { - 'default': { - 'ENGINE': 'haystack.backends.elasticsearch5_backend.Elasticsearch5SearchEngine', - 'URL': HAYSTACK_SEARCHBOX_SSL_URL, - 'INDEX_NAME': 'haystack-prod', - }, -} - SECRET_KEY = config('SECRET_KEY') ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv()) diff --git a/templates/admin/base_site.html b/templates/admin/base_site.html index 85ef099d7..ce757a4d2 100644 --- a/templates/admin/base_site.html +++ b/templates/admin/base_site.html @@ -1,4 +1,4 @@ -{% extends "admin/base.html" %} +{% extends "admin_interface:admin/base_site.html" %} {% load i18n %} {% block title %}{{ title }} | {% trans 'python.org' %}{% endblock %} From 55b298dd73a82ce55c46acbb48bf1d477b462fde Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Tue, 21 Mar 2023 05:59:24 -0400 Subject: [PATCH 023/112] revert inadvertently committed. was headed this direction while responding to https://status.python.org/incidents/kwsfwt5q4rg1 --- pydotorg/settings/heroku.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pydotorg/settings/heroku.py b/pydotorg/settings/heroku.py index 4a0e4cc35..5adff485c 100644 --- a/pydotorg/settings/heroku.py +++ b/pydotorg/settings/heroku.py @@ -20,6 +20,18 @@ } } +HAYSTACK_SEARCHBOX_SSL_URL = config( + 'SEARCHBOX_SSL_URL' +) + +HAYSTACK_CONNECTIONS = { + 'default': { + 'ENGINE': 'haystack.backends.elasticsearch5_backend.Elasticsearch5SearchEngine', + 'URL': HAYSTACK_SEARCHBOX_SSL_URL, + 'INDEX_NAME': 'haystack-prod', + }, +} + SECRET_KEY = config('SECRET_KEY') ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv()) From 0422be5e0f4241475abc8062eaeb04cf05ce7392 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Fri, 12 May 2023 13:41:49 -0400 Subject: [PATCH 024/112] add notes regarding basic membership (#2271) --- templates/includes/authenticated.html | 4 ++-- templates/users/membership_form.html | 12 ++++++++++++ templates/users/user_detail.html | 18 +++++++++++++++++- 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/templates/includes/authenticated.html b/templates/includes/authenticated.html index bdd2c671e..82d5b38f6 100644 --- a/templates/includes/authenticated.html +++ b/templates/includes/authenticated.html @@ -7,9 +7,9 @@
  • Edit your user profile
  • Change your password
  • {% if request.user.has_membership %} -
  • Edit your PSF membership
  • +
  • Edit your PSF Basic membership
  • {% else %} -
  • Become a PSF member
  • +
  • Become a PSF Basic member
  • {% endif %} {% if request.user.sponsorships %}
  • Sponsorships diff --git a/templates/users/membership_form.html b/templates/users/membership_form.html index cef557897..ecc032467 100644 --- a/templates/users/membership_form.html +++ b/templates/users/membership_form.html @@ -19,6 +19,18 @@

    Register to become a PSF Basic Member

    {% endif %}
    +

    + Basic membership is not a voting membership class.
    For more information see Article IV + of the PSF Bylaws. +

    +

    + All other membership classes are recorded on psfmember.org.
    + Please log in there and review your user profile + to see your membership status.
    + If you believe you are a member but do not have an account on psfmember.org, please + create an account and verify your + email, then email psf-donations@python.org to get your account linked to your membership. +

    For more information and to sign up for other kinds of PSF membership, visit our Membership Page.

    diff --git a/templates/users/user_detail.html b/templates/users/user_detail.html index f584af139..ce2f5ee90 100644 --- a/templates/users/user_detail.html +++ b/templates/users/user_detail.html @@ -21,7 +21,23 @@

    Name: {% firstof object.get_full_name object %}

  • {% comment %} From c4ee749942227ca75c8e670546afe67232d647b2 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Thu, 3 Aug 2023 15:12:29 -0400 Subject: [PATCH 032/112] Update feature_request.md --- .github/ISSUE_TEMPLATE/feature_request.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 316039ee5..514274e5f 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -8,11 +8,10 @@ This is the repository and issue tracker for https://www.python.org website. If you're looking to file an issue with CPython itself, please go to -https://bugs.python.org +https://github.com/python/cpython/issues/new/choose Issues related to Python's documentation (https://docs.python.org) can -also be filed in https://bugs.python.org, by selecting the -"Documentation" component. +also be filed at https://github.com/python/cpython/issues/new?assignees=&labels=docs&template=documentation.md. --> **Is your feature request related to a problem? Please describe.** From ad5e23fc4f6d5d26386f6a355096c459580ed0ad Mon Sep 17 00:00:00 2001 From: Michael Cohen Date: Tue, 14 Nov 2023 05:30:01 -0800 Subject: [PATCH 033/112] Update python.org socialize menu to include a link to the PSF Mastodon account (#2323) * Update python.org socialize menu to include a link to the PSF Mastodon account Updated socialize menu to include a link to the official PSF Mastodon account. Details: - Added Mastodon icon to Pythonicon font family. Used IcoMoon to generate icons - Updated all related CSS and Sass files - Updated the socialize menu in the base.html template To see all rendered Pythonicon fonts, open `static/fonts/demo.html` * Updated help and close icons unicodes Help icon is now assigned unicode `\3f` (`?`). Close icon is now assigned unicode `\58` (`X`). Required regenerating fonts and updating CSS + Sass files. --- static/fonts/Pythonicon.eot | Bin 14020 -> 12628 bytes static/fonts/Pythonicon.json | 1906 ++++++++++++++++++++-------------- static/fonts/Pythonicon.svg | 84 +- static/fonts/Pythonicon.ttf | Bin 13840 -> 12452 bytes static/fonts/Pythonicon.woff | Bin 13916 -> 12528 bytes static/fonts/demo.html | 601 +++++++++++ static/fonts/demo/demo.css | 155 +++ static/fonts/demo/demo.js | 30 + static/fonts/index.html | 410 -------- static/fonts/style.css | 192 ++-- static/sass/_fonts.scss | 97 +- static/sass/style.css | 266 ++--- static/sass/style.scss | 2 +- templates/base.html | 5 +- 14 files changed, 2233 insertions(+), 1515 deletions(-) mode change 100755 => 100644 static/fonts/Pythonicon.eot mode change 100755 => 100644 static/fonts/Pythonicon.json mode change 100755 => 100644 static/fonts/Pythonicon.svg mode change 100755 => 100644 static/fonts/Pythonicon.ttf mode change 100755 => 100644 static/fonts/Pythonicon.woff create mode 100644 static/fonts/demo.html create mode 100644 static/fonts/demo/demo.css create mode 100644 static/fonts/demo/demo.js delete mode 100644 static/fonts/index.html diff --git a/static/fonts/Pythonicon.eot b/static/fonts/Pythonicon.eot old mode 100755 new mode 100644 index db8f2b452a8ee11b20fbaf60cba52cd5bda1ea62..f36815ed5b87531373e95e1be7916f592e2a14d9 GIT binary patch literal 12628 zcmb_jcW@imncue+i$z=PE*8BlfF%I}1PFj&6Prj;qC~4%rsPJ^5+lm7%1Lr8$EuDz z@gJEaXC+SJcx)$=N#eM~$)(x8lXObC*eRD}<}R1wI3C|Q@ul6}q4qi_ZdBW8&skkLn62O&p@qmT-xjT0rJKtN;Ov0sLP9fBfL=fjQgkH4*Ut2h{PI!-tL@gLcAIJcr{6 ziuyfzKfw?L`4RHl5b{3ji+)9v5s%X?yAU*cr0ub!URq1hHx3EL4g}V`XOTHE9@(dSM*nj#ronR#NtwLDDevaimMTd7GGZc z`r;EoHb@64H3zwu*J@@mUx+|Zh8xF13!$BOK-GH9#BVhWTDB zajYWBY80uya-yp?h-%$cv7#4{o}sjAS%L)St!ULsH;y*%Y9#|nv?Plobu*~k<%3cb zndK;^{>MtbFebw_R>)UK`!e4zpMLs5A)oX|IF|i9!?13&lCKnS1q-MD31z+ckQ5ahUEYkEcDaHM zAsg|8olcqKI6)9HVYO>ZEE-dM;i;mWkqC0pSbTyqOgeO|P6dh6IlZRW)SAkv6nXV_ zm~Es#`msko`Uu<~gE#er)%mNFqCR6Lw30tU5Dez4$(t;34NU3-#NR{9EH>ypsH7E5 zPQgo&eJUoj>MNCtl~RLaR1)(8?j}YVrgJ7CN^k6)idH_oGN;&*C9C0%K3emS2fOBRy9jnsCVsc!An5HJAd*;VF_sNj8FjlTkdM z)*!8#=<2R@XLMvH)66X7f!I(q)*IZE`>pYGWxLCRMCV|6+s-w=Ev=gMk~bJ6 z$DQ4kUAqQ;TU8jwkk@!`BMtR1Lo>9izkEY<&A`~ciOSe*{ktZ* zUM`N=9tcV}kre!|^7#J2UF%CP7yDfvN^;R+*M$T1!DLC^@C2M@P@p2M1DS>7odwrUqsQ zjmv|J#2PG=Z7?35H04N?=p_b;wZwX$#x_&3iZWX&Rx6%rrONz;bmgcbs}*4)a!Ji1 z2PEsRR4b)~NL8WR3_Mlb|0?!X75qw9fg;p};f1>!LY1>5;PC0RHa7Oe)~%tWruBHe zh^()vpCeDy&!K+f>*QVad+^tEpD-2>P5!2Sd7|(3+fnKK2L{o?LfMp~ru-_C9=s&FU zsIjCpR+NT#vILoi@JgYAFp|sxK7=gsq=_(dAPP$)4rUb061`^0IF&;SH*DQ{TuUak z<6F1haO2i3$2GW)Z{2dE@oAqpnoqV(ME;=n#QfQU66$FaHIJU3?+sM~*M|G!Xsv%| z?~YP7J0#2WgVem0aYcb!pm5E2K<%APopI(O#^XJ0;ez8E&pSGTZ9V8|ih6H2&T-!o z>^~Z~De@gT9^c;8RU5(mXU+ALg#NpUIFToA2IzGsPynVdupdTx1{TupavJ0U1mM*b zudEpjRW(Hu%SyRg7B$tRL`?_TYzl8nY?nbA0G%{zJ%#+TFNREyR@2Qj08-#Jm@?xm zk48;<0|9S+S_}k4^3nSAy1BV^Et#K%1$)}4ilyMY zf<;)rF5zIbJuFLMv>iv*4I9U*;=8;)mb29n-4#s~i-~C0u<;6xM!{k9>9wJvh^2>E z46U6kpQ%jtROE12uJlY+&XgzDiVDl}JPX4?OnN*?5uobg;^O1fBJ`JqSwu)Y(!_+w za5@m*l!r}B1_JXeI*m?VH10-^{QM>3=M5=fx8|?$5}7k_f??y*!b>l`+ma3DtggJf zF;<^2@r4VNfPRovJ3v_=0J~9uYY-rtArk4U;6XqLODmaHeNzvzL_L=l8!}xXe-gO< znYKsD#uw}-W`H{FB?tH|7%h*e~=m=4I!u` zpeyW@1IcR#KK}86Ystx=s%pI5&TFa~OxDCF9wsSt`7)x&ho2B@Nf>JwCpGnq43Pu1 zlUPmDK%A=RHAT{-8da;-^s3rYhcKvytIWirH78=w${u126z1zeitmA$@pe#|j}ga-6RWqKTL#&*W$yBF z4-mk_J-U<-t?5CP6|Dvj15dRdWD@q60aZ=*H9alK&~FXk@P9YHvSAJF2>Put(9yPH zEdT!g`@env{q>K2=tJNB5O%?BbbV;=yytwe=)5Yp!KCCtWYD?5!->X%@J=&x|Ud>rmH4Ez^lRE04`AE;m@)z zuC3>9gBUnB`@}(#?9p36hUGNK0bW|221)}EHQ><_d}1sp(3HSxjRT4DRv=RY7BxW9 z6##{{A+o1U@9EL)BLC>&SKb_(_+b-3y~qd*Cac~<(FZ^G_BVhgyuLT* zTpsj?RV4$HsDfq%KTwhM8t4V^ttMKFhx&VvI)P%wOB2Sc`}UDXjbBX|zaVd)Z#~Q} z4Gvx&9Nc}2K`bs_o`o?>gRb+KiSIGK9S74IA+a1QgZd4>t{Nz8weE_Z!M`NOaw^F3 zDhL2=HEAbtY_bz&Dnm$z^342trec-XWtJWVs|=^sy1Qb?Cvz90F1Onijil34>2x&W zhAR>^J(1V9^o-4f(E1iuiFeLBl7iuIga`FP;pTi^)3Fgn*Gr|hl}dU_k{PEfIv92& z9Ce3-{PoppvFiVH@0Q@q7}{r{imTVS@btU`%1JrBtIHt5PlBadV-d4}zV? zfJ7GFyF@(&>no-)=#g)c!hdrL{_$^1B_saV(E-Z_YhE}AKdePJ;+1Cwcvz0~L8UOY z={Gan!D<4=oD4SCl@ryb;m(A=fRIh=gTjD%kxbaj~IgVu?65WV(@?T)x_qqIt_3(F~ zLuqCkVx@%3PV)UFvmm(;L?r5%ic^#)>XyARZeuL2-WTrZII?zZ!=9bfcc(K}QIl)e9_h$~VtHjP z!&rAcYz(cs@-El*(i*5C4I>VKkt&8_W>2yBD7T7iX~C=ip)@{Tf(O~|b9vmJYAV$p zt*OE8@Yuk>^}!%-`^5)2E*?L$adJnvI|$)N=jQIubudh8$iMJKvs5VA?W=~{Q>m)Q zExPaH?ZM#n0|R5Bia$^e?U>wnC?2=0O| z!w?>Z3RiBu{c--*hc<7Xn%O^^cBA92)`-L)LD@fbZu6EK&V>S_c$3TI<0TW52w-)R zU?&Ij5o8LJ#5R_6ki|CTG)J9Tc)hX#)k$iya>_6kh}T|2^-IQAvC*SE ziHr;XO#W`N!qgY3%A_%}aO%`+e?ECvefLA<$qnU)cSD`a_e=D*Koc-vXkf=^$@$xj zyDy*<==8-^DR2o5qtnLOzrGy^8%(P_h`Oso6;l=&&l!yhS~q0j)6b9T#iu*N0JeABua^>r74YG=R*^w-maM`hqlc@=tm%{U7^y?(phkWJ$J|_TJ{=TPp)5kzh6Dnx;@JUa$qk62p*7FGoT2G;Asjn=vHP zTI$L5`o>#t-6-o~4Rn)eE*A~9F$b9Wi8BIUOSIj(aq`x-M2#16ktjfyiFt@?3*uz7 zo$2;uB%FB_YJBz9jT>*}Z8Id9i$=4_z`9#Vn>%2i@o&oG-1&`x8GFzb&1R$ZKi{%0 zkjz3Vgl23uoDW!O+C3kmUWc_uB|-#PQPKzi96&P;!3*%1We2Qg7`!LTX*y^{)QiSb zK3(6MN{Pm&!idawbPSTW4R&v(H`_ zJvnsY!jSP*^V95yH5LR|XF!WujA z(J^Mh)+P$bv~+i8z-_MCCRBkezHZgZ#55-$%(IqK%2;oUd5(l~EKMOl9}+bP>F+KqhlN62foIw3RoZ=lF4%x=j5Jr*?7TsxcQ^AsCck)7S zP>9)ikztCeuizHFPC@n3bh~e@O_+A{Hx0mV!VC2cry*cNX9aJNNqv}_7}5JciNYHZ zCe0bpyx_*_7ff7W5a9Hsa};J7c%WkrnJOCQQHI5CxS6JK10CYE<|&7(z-IInK5DXp zp_{C5YQPF39rXBJ4DXG{H|MgtS91U>QcRN-VjE?$!tKSZu-h>!$btJCtRSc5PzYPy zcdR^Rv9f+@9JDS8IPrz}gbl#H2OR)TeBX18&5;*m-bQ0akOF7C+u{W8;)R}|5XYQg zJ5@E0IpOe06xHq<<%R2nq7pr+4p0 zpE7o#vuDZP`oA>g-$ipj$4Vm1!18&+=$ zD@a>~ev@0zez>pm!)N-=p6NWoOFS!p!X~<$cG|_qdjnpDqU}yK#en)Nh8?~n98qG` zb~x&S1VPS-9*Oq0NxYk36}KxTD=85aYKLF&b_BSX&)*#lg`H8CoK;yHf=S{{iJXg7 zWiC4|i!`TZy&yJu${A^A88_HPI7CynuBi&dJzpNYd^Eli%79MD6B$n6| zwdW#|E_ZBBf=2G?ipMHWr5aXJ?qG*UDZq}CnwQacZ+_2vZvMpn{hu)I0yLW#3BoCu z@K6L+0f*-ERRiIS)02-n0uG?EkW$okiB$d0xF9K(jZ zz%^3f{q3R?>^gS04@*hj4Pmg?OVW0Zv9sQ|i;b&t%Hc`-crPE!I=wxSkS+xKVuET9 zX-sT94CV!(T(m!I1Nu3+)R5?*9EpLT!%b0cInjYoDnz14hZ6~QcQGb2vUeZ>`)54M z*%4~zoVIX(6iPsWKzKaHXd$~QKpO=;6zTCgvq7lWm-aYPvKnWd2`_7BI6FW`80=3c0`84B+zyQw-DJm7)U_v0WY*VR&?71PX1AhmPPt z!a;e&p%mv7%{`yTsGkA0qzNbCg#)QUz?X35L6op&ngCp9`cw$QjuZFXbDHGW9g8oF zCXTJU?w))8?c6!I(W}O3bQTV+^!83r{q?it=~D(ljVxTm@)n=LY3d#+q8;|OyI^;F z820j3#ZpcHO*M{Ldch_G1NsrxkwgL2Bo4MBrIvbyF@&6H<9F>_QAIMI2fP0esBs_% zMvRN-LjCKb=;`6YKa4!yH{zdiw^ktPpY8kf$VYA(-7$GSH5Qt>d+HuEW4wSg<74QD zNXQ!hn*mtK7#B^vZuK_~c=0np&y}F0d0e1*gi}kX)`=3eVppl?gYZ&OEwZcz`qP>;Q=}n{^oMnN4XJVPKgouGOc&>5REp zC)asnE>=eLII5Fs&9~OpZ_lNSLN4z!^ibl6bLC9{0QyBSByeP_wr_`GICwOGP zeyHUI$7DfqXw4F!VQJkSZsK^9q}h5Nh-&` z_k28_$s9bG$;9K&e=lB!Kx~fn2VfAw7=>r}xfj1Y;~w|}A%L=L^kMp!Oqlr!yN&%McO&;R+iu&J z_<8=<_6LP09bv~)PQuyeJmtLXVqKH2U%T7fTimaB9v2Ub-;=MC?^Or|Z{}k=C!R{vYF9%hdn? literal 14020 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 diff --git a/static/fonts/Pythonicon.json b/static/fonts/Pythonicon.json old mode 100755 new mode 100644 index 05f5b6a8b..ddcdbc09f --- a/static/fonts/Pythonicon.json +++ b/static/fonts/Pythonicon.json @@ -1,787 +1,1121 @@ { - "IcoMoonType": "selection", - "icons": [ - { - "icon": { - "paths": [ - "M1024 429.256c0-200.926-58.792-363.938-131.482-365.226 0.292-0.006 0.578-0.030 0.872-0.030h-82.942c0 0-194.8 146.336-475.23 203.754-8.56 45.292-14.030 99.274-14.030 161.502 0 62.228 5.466 116.208 14.030 161.5 280.428 57.418 475.23 203.756 475.23 203.756h82.942c-0.292 0-0.578-0.024-0.872-0.032 72.696-1.288 131.482-164.298 131.482-365.224zM864.824 739.252c-9.382 0-19.532-9.742-24.746-15.548-12.63-14.064-24.792-35.96-35.188-63.328-23.256-61.232-36.066-143.31-36.066-231.124 0-87.81 12.81-169.89 36.066-231.122 10.394-27.368 22.562-49.266 35.188-63.328 5.214-5.812 15.364-15.552 24.746-15.552 9.38 0 19.536 9.744 24.744 15.552 12.634 14.064 24.796 35.958 35.188 63.328 23.258 61.23 36.068 143.312 36.068 231.122 0 87.804-12.81 169.888-36.068 231.124-10.39 27.368-22.562 49.264-35.188 63.328-5.208 5.806-15.36 15.548-24.744 15.548zM251.812 429.256c0-51.95 3.81-102.43 11.052-149.094-47.372 6.554-88.942 10.324-140.34 10.324-67.058 0-67.058 0-67.058 0l-55.466 94.686v88.17l55.46 94.686c0 0 0 0 67.060 0 51.398 0 92.968 3.774 140.34 10.324-7.236-46.664-11.048-97.146-11.048-149.096zM368.15 642.172l-127.998-24.51 81.842 321.544c4.236 16.634 20.744 25.038 36.686 18.654l118.556-47.452c15.944-6.376 22.328-23.964 14.196-39.084l-123.282-229.152zM864.824 548.73c-3.618 0-7.528-3.754-9.538-5.992-4.87-5.42-9.556-13.86-13.562-24.408-8.962-23.6-13.9-55.234-13.9-89.078 0-33.844 4.938-65.478 13.9-89.078 4.006-10.548 8.696-18.988 13.562-24.408 2.010-2.24 5.92-5.994 9.538-5.994 3.616 0 7.53 3.756 9.538 5.994 4.87 5.42 9.556 13.858 13.56 24.408 8.964 23.598 13.902 55.234 13.902 89.078 0 33.842-4.938 65.478-13.902 89.078-4.004 10.548-8.696 18.988-13.56 24.408-2.008 2.238-5.92 5.992-9.538 5.992z" - ], - "tags": [ - "bullhorn", - "megaphone", - "announcement", - "advertisement", - "news" - ], - "grid": 16 - }, - "properties": { - "order": 1, - "id": 28, - "prevSize": 32, - "code": 58880, - "name": "bullhorn", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M620.62 12.098c-40.884-6.808-83.266-9.918-123.999-9.728-40.695 0.19-79.569 3.622-113.74 9.728-100.693 17.806-118.993 54.974-118.993 123.657v90.738h238.004v30.208h-327.282c-69.177 0-129.764 41.624-148.689 120.68-21.883 90.662-22.85 147.266 0 241.873 16.934 70.466 57.287 120.68 126.502 120.68h81.787v-108.753c0-78.583 68.001-147.797 148.67-147.797h237.739c66.143 0 118.955-54.556 118.955-120.984v-226.664c-0-64.455-54.405-112.905-118.955-123.639zM395.681 166.021c-24.671 0-44.658-20.215-44.658-45.227 0-25.050 19.987-45.473 44.658-45.473 24.557 0 44.658 20.423 44.658 45.473 0.019 24.993-20.082 45.227-44.658 45.227z", - "M995.157 394.923c-17.067-68.798-49.74-120.623-118.955-120.623h-89.335v105.662c0 82.034-69.48 150.945-148.67 150.945h-237.72c-65.119 0-118.974 55.732-118.974 120.927v226.588c0 64.493 56.073 102.438 118.974 120.946 75.34 22.13 147.589 26.131 237.739 0 59.885-17.332 118.993-52.281 118.993-120.946v-90.738h-237.701v-30.189h356.712c69.139 0 94.967-48.242 118.955-120.642 24.841-74.562 23.799-146.242-0.019-241.929zM625.417 848.194c24.652 0 44.639 20.177 44.639 45.189 0 25.145-19.987 45.454-44.639 45.454-24.614 0-44.658-20.309-44.658-45.454 0-24.993 20.063-45.189 44.658-45.189z" - ], - "grid": 0, - "tags": [ - "python-alt" - ] - }, - "properties": { - "order": 2, - "id": 0, - "prevSize": 24, - "code": 58881, - "name": "python-alt", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M770.37-2.37h-521.481c-138.221 0-251.259 113.076-251.259 251.259v521.481c0 138.183 113.038 251.259 251.259 251.259h521.481c138.183 0 251.259-113.076 251.259-251.259v-521.481c0-138.183-113.076-251.259-251.259-251.259zM958.369 763.183c0 100.447-95.63 195.489-195.508 195.489h-502.348c-97.033 0-195.527-95.042-195.527-195.489v-65.479h893.364v65.479zM958.369 636.075h-893.364v-253.649h893.364v253.649zM958.369 320.796h-893.364v-59.999c0-96.446 96.104-195.489 195.527-195.489h502.348c99.878 0 195.508 99.044 195.508 195.489v59.999zM383.924 223.611h260.741v-61.63h-260.741v61.63zM644.665 479.611h-260.741v61.63h260.741v-61.63zM644.665 797.26h-260.741v61.63h260.741v-61.63z" - ], - "grid": 0, - "tags": [ - "pypi" - ] - }, - "properties": { - "order": 3, - "id": 0, - "prevSize": 24, - "code": 58882, - "name": "pypi", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M957.63 189.212v574.805c0 94.853-64 128.531-64 128.531s0-730.624 0-895.962l-893.63 1.043v771.66c0 138.221 113.076 251.259 251.259 251.259h519.111c138.183 0 251.259-113.038 251.259-251.259v-580.286l-64 0.209zM831.393 930.74c0 0-25.998 23.514-72.59 23.514 0 0-426.515 1.157-497.436 1.157-91.041 0-196.058-97.527-196.058-192.891s0.967-700.094 0.967-700.094h765.118v868.314z", - "M770.37 173.511v-47.407h-636.833v125.63h636.833z", - "M133.537 378.937h315.24v65.574h-315.24v-65.574z", - "M133.537 761.363h635.24v65.574h-635.24v-65.574z", - "M133.537 506.937h315.24v65.574h-315.24v-65.574z", - "M133.537 632.567h315.24v65.574h-315.24v-65.574z", - "M770.37 630.215v-251.278h-259.963v320.019h259.963z" - ], - "grid": 0, - "tags": [ - "news" - ] - }, - "properties": { - "order": 4, - "id": 0, - "prevSize": 32, - "code": 58883, - "name": "news", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M508.207 66.882c-244.452 0-442.615 198.163-442.615 442.615 0 244.452 198.163 442.615 442.615 442.615 244.471 0 442.615-198.163 442.615-442.615-0-244.452-198.201-442.615-442.615-442.615zM164.485 424.467l-22.414-22.414c22.225-75.928 67.508-141.862 127.526-190.18l34.266 127.829c-53.134 17.010-100.712 46.364-139.378 84.764zM409.335 764.188c-52.679 0-95.384-42.705-95.384-95.403 0-38.116 22.528-70.751 54.898-86.016l42.648-197.879 45.378 201.709c28.463 16.479 47.825 46.952 47.825 82.185-0.019 52.698-42.705 95.403-95.365 95.403zM409.335 323.205c-23.571 0-46.554 2.408-68.779 6.884l-38.116-142.241c59.335-38.153 129.934-60.283 205.767-60.283 35.992 0 70.751 5.139 103.765 14.45l-83.778 202.278c-37.111-13.502-77.065-21.087-118.86-21.087zM731.932 540.52c-32.18-79.189-92.615-143.834-168.77-181.476l84.897-204.971c131.641 51.883 227.48 174.839 240.375 321.612l-156.501 64.834z" - ], - "grid": 0, - "tags": [ - "moderate" - ] - }, - "properties": { - "order": 5, - "id": 0, - "prevSize": 32, - "code": 58884, - "name": "moderate", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M855.249 128.341c23.211 0 42.78 19.608 42.78 42.78v680.941c0 23.211-19.57 42.78-42.78 42.78h-680.96c-23.192 0-42.78-19.57-42.78-42.78v-680.941c0-23.192 19.608-42.78 42.78-42.78h680.96M855.249 0h-680.96c-94.113 0-171.122 77.009-171.122 171.122v680.941c0 94.132 77.009 171.122 171.122 171.122h680.941c94.132 0 171.122-77.009 171.122-171.122v-680.941c0.019-94.094-76.99-171.122-171.103-171.122v0z", - "M421.812 682.401v-205.464h-118.519v205.464h-64.853v-464.915h64.853v203.321h118.519v-203.321h65.593v464.934h-65.593z", - "M666.131 839.054c-76.516 0-124.549-49.512-124.549-115.105 0-51.010 27.629-84.556 56.813-96.18l-29.886-32.047c0.702-21.144 16.043-40.789 32.047-49.55-26.226-19.646-42.249-48.792-42.249-90.321 0-64.152 41.51-110.099 104.922-110.099 15.322 0 26.965 2.219 35.707 5.12 10.942 3.622 22.604 5.803 37.129 5.803 16.043 0 31.346-5.803 40.088-11.605l8.761 51.75c-4.399 3.622-17.503 8.021-26.965 8.021 5.784 10.923 10.183 29.146 10.183 51.029 0 59.752-37.888 108.544-102.040 110.023-21.106 0-33.527 5.784-33.527 18.223 0 4.361 3.66 11.643 11.681 14.601l63.374 21.826c51.75 17.484 81.636 53.21 81.636 110.080 0.038 61.080-48.052 108.43-123.127 108.43zM690.195 671.497l-40.808-11.7c-31.308 2.939-51.75 26.245-51.75 64.834 0 33.545 22.604 65.65 67.755 65.65 43.748 0 65.612-30.625 65.612-59.733 0.019-27.743-13.843-51.75-40.808-59.051zM663.249 394.562c-27.743 0-48.090 26.965-48.090 61.25 0 34.949 20.347 61.175 48.090 61.175 26.226 0 48.773-26.226 48.773-61.175 0.019-34.285-20.347-61.25-48.773-61.25z" - ], - "grid": 0, - "tags": [ - "mercurial" - ] - }, - "properties": { - "order": 6, - "id": 0, - "prevSize": 32, - "code": 58885, - "name": "mercurial", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M899.167 678.665l-291.499 50.157v29.412c0 45.151-50.498 81.655-94.872 81.655-44.582 0-94.834-36.504-94.834-81.655v-29.412l-291.537-50.157c-69.101 0-125.63-63.962-125.63-63.962v282.074c0 69.12 56.529 125.63 125.63 125.63h772.741c69.101 0 125.63-56.51 125.63-125.63v-282.074c0 0-56.529 63.962-125.63 63.962z", - "M899.167 254.369h-194.37v-66.37c0.19-36.030-11.397-69.367-35.366-92.35-23.893-23.059-57.079-33.413-92.634-33.28h-130.37c-35.593-0.114-68.779 10.221-92.653 33.28-24.007 22.983-35.556 56.32-35.366 92.35v66.37h-191.981c-69.101 0-125.63 56.529-125.63 125.63v128c0 69.12 56.529 125.63 125.63 125.63l339.039 56.168v52.338c0 26.491 21.163 47.938 47.332 47.938 26.055 0 47.369-21.447 47.369-47.938v-52.357l339.001-56.149c69.101 0 125.63-56.51 125.63-125.63v-128c0-69.101-56.529-125.63-125.63-125.63zM384.777 187.999c0.19-23.268 6.466-36.143 15.019-44.582 8.704-8.306 22.907-14.601 46.63-14.715h130.37c23.666 0.114 37.907 6.391 46.573 14.715 8.571 8.439 14.81 21.314 15.057 44.582-0.019 21.902-0.019 45.416-0.019 66.37h-253.63c0-20.954 0-44.468 0-66.37z" - ], - "grid": 0, - "tags": [ - "jobs" - ] - }, - "properties": { - "order": 7, - "id": 0, - "prevSize": 32, - "code": 58886, - "name": "jobs", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M772.741-0.019h-521.481c-138.183 0-251.259 113.076-251.259 251.278v521.481c0 138.183 113.076 251.259 251.259 251.259h521.481c138.221 0 251.259-113.076 251.259-251.259v-521.481c0-138.202-113.038-251.278-251.259-251.278zM593.029 896.777h-185.401v-189.573h185.401v189.573zM748.791 409.429c-14.639 24.652-44.601 54.746-89.809 90.283-31.497 24.955-51.39 44.999-59.639 60.113-8.287 15.132-12.383 55.751-12.383 80.1h-177.778v-38.703c0-30.246 3.432-54.803 10.297-73.671 6.865-18.887 17.048-36.087 30.625-51.693 13.577-15.588 44.051-43.046 91.458-82.318 25.259-20.594 37.888-39.462 37.888-56.604s-5.082-30.473-15.208-39.993c-10.126-9.5-25.505-14.26-46.080-14.26-22.168 0-40.467 7.339-54.955 21.978-14.526 14.658-23.78 40.22-27.838 76.724l-181.495-22.452c6.239-66.731 30.473-120.453 72.742-161.166 42.268-40.695 107.046-61.042 194.351-61.042 68.001 0 122.861 14.184 164.693 42.572 56.737 38.362 85.106 89.505 85.106 153.429-0 26.51-7.301 52.072-21.978 76.705z" - ], - "grid": 0, - "tags": [ - "help" - ] - }, - "properties": { - "order": 8, - "id": 0, - "prevSize": 32, - "code": 63, - "name": "help", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M129.271 383.507l383.166 382.805 380.075-382.805h-190.255v-320.076h-382.085v320.076z", - "M736.484 635.657l-224.047 225.47-225.375-225.185h-288.161v135.149c0 138.202 113.057 251.259 251.259 251.259h521.481c138.183 0 251.259-113.057 251.259-251.259v-135.149l-286.417-0.284z" - ], - "grid": 0, - "tags": [ - "download" - ] - }, - "properties": { - "order": 10, - "id": 0, - "prevSize": 32, - "code": 58889, - "name": "download", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M731.439 149.751l-25.031 39.329-90.529-57.628-186.292 292.636 39.974 25.467 160.825-252.644 50.574 32.161-331.473 520.742 9.937 51.333-36.162 57.666 6.201 30.853 30.891-7.623 35.669-56.889 52.148-12.516 381.933-600.064z", - "M772.741-2.37h-521.481c-138.202 0-251.259 113.057-251.259 251.259v521.481c0 138.183 113.057 251.259 251.259 251.259h521.481c138.183 0 251.259-113.076 251.259-251.259v-521.481c0-138.202-113.076-251.259-251.259-251.259zM99.366 811.179c-26.169 0-47.332-21.447-47.332-47.919 0-26.624 21.163-48.223 47.332-48.223 26.055 0 47.369 21.599 47.369 48.223-0.019 26.472-21.314 47.919-47.369 47.919zM99.366 557.549c-26.169 0-47.332-21.447-47.332-47.938 0-26.605 21.163-48.223 47.332-48.223 26.055 0 47.369 21.618 47.369 48.223-0.019 26.491-21.314 47.938-47.369 47.938zM99.366 303.919c-26.169 0-47.332-21.428-47.332-47.938 0-26.605 21.163-48.223 47.332-48.223 26.055 0 47.369 21.618 47.369 48.223-0.019 26.51-21.314 47.938-47.369 47.938zM955.259 735.365c0 119.637-97.887 217.524-217.524 219.895l-543.365-1.745v-886.689l543.365-0.455c119.637 0 217.524 97.887 217.524 217.524v451.47z" - ], - "grid": 0, - "tags": [ - "documentation" - ] - }, - "properties": { - "order": 11, - "id": 0, - "prevSize": 32, - "code": 58890, - "name": "documentation", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M512.986 682.989c57.647 0 104.277-46.592 104.277-104.183 0-57.496-46.63-104.145-104.277-104.145-57.458 0-104.164 46.649-104.164 104.145 0.019 57.591 46.706 104.183 104.164 104.183", - "M763.733 711.32c45.378 0 82.072-36.674 82.072-81.996 0-45.265-36.712-81.958-82.072-81.958-45.189 0-81.996 36.712-81.996 81.958 0 45.321 36.826 81.996 81.996 81.996", - "M785.749 748.791c-39.045 0-73.519 17.863-95.004 45.303 7.851 16.839 12.231 35.423 12.231 54.955v110.042h200.666v-99.556c-0.019-61.156-52.717-110.744-117.893-110.744", - "M260.305 711.32c45.189 0 81.996-36.674 81.996-81.996 0-45.265-36.807-81.958-81.996-81.958-45.359 0-82.091 36.712-82.091 81.958-0 45.321 36.731 81.996 82.091 81.996", - "M238.308 748.791c-65.195 0-117.893 49.569-117.893 110.744v99.556h200.666v-110.042c0-19.532 4.38-38.135 12.212-54.955-21.466-27.42-55.96-45.303-94.985-45.303", - "M512.986 714.562c-84.689 0-153.259 64.417-153.259 143.91v162.437h306.498v-162.437c0-79.493-68.494-143.91-153.24-143.91", - "M891.847 129.119c0-70.068-169.491-126.919-379.051-126.919-208.896-0-378.728 56.851-378.728 126.919 0 44.108 67.167 82.906 168.903 105.662l-16.801 173.018 96.332-159.611c25.429 3.129 52.072 5.385 79.72 6.637l49.247 193.858 49.19-193.726c28.729-1.214 56.358-3.527 82.697-6.751l96.332 159.592-16.801-172.999c101.888-22.737 168.96-61.554 168.96-105.681z" - ], - "grid": 0, - "tags": [ - "community" - ] - }, - "properties": { - "order": 12, - "id": 0, - "prevSize": 32, - "code": 58891, - "name": "community", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M772.741-0.019h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM316.151 402.015l-124.947 108.241 124.947 108.241v112.242l-254.521-220.482 254.521-220.482v112.242zM461.577 825.135l-76.383-0.265 170.591-630.803 77.103-0.91-171.311 631.979zM699.164 725.94v-112.242l119.41-103.443-119.41-103.443v-112.242l248.984 215.685-248.984 215.685z" - ], - "grid": 0, - "tags": [ - "code" - ] - }, - "properties": { - "order": 13, - "id": 0, - "prevSize": 32, - "code": 58892, - "name": "code", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M770.37-2.37h-521.481c-138.183 0-251.259 113.076-251.259 251.259v521.481c0 138.183 113.076 251.259 251.259 251.259h521.481c138.221 0 251.259-113.076 251.259-251.259v-521.481c0-138.183-113.038-251.259-251.259-251.259zM825.742 670.758l-155.117 155.098-160.18-160.18-160.199 160.218-155.136-155.136 160.199-160.218-160.199-160.218 155.136-155.098 160.18 160.199 160.18-160.199 155.117 155.098-160.18 160.218 160.199 160.218z" - ], - "grid": 0, - "tags": [ - "close" - ] - }, - "properties": { - "order": 14, - "id": 0, - "prevSize": 32, - "code": 88, - "name": "close", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M772.741-2.37h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.183 113.057 251.259 251.259 251.259h521.481c138.183 0 251.259-113.076 251.259-251.259v-521.481c0-138.183-113.076-251.259-251.259-251.259zM765.63 82.849c26.586 0 48.223 21.144 48.223 47.332 0 26.036-21.637 47.351-48.223 47.351-26.472 0-47.919-21.314-47.919-47.351 0-26.188 21.447-47.332 47.919-47.332zM512 82.849c26.586 0 48.223 21.144 48.223 47.332 0 26.036-21.637 47.351-48.223 47.351-26.491 0-47.919-21.314-47.919-47.351 0-26.188 21.428-47.332 47.919-47.332zM258.37 82.849c26.605 0 48.223 21.144 48.223 47.332 0 26.036-21.618 47.351-48.223 47.351-26.491 0-47.919-21.314-47.919-47.351 0-26.188 21.428-47.332 47.919-47.332zM732.843 953.666h-451.47c-119.637 0-217.524-97.887-219.895-217.524l1.745-479.365h886.689l0.455 479.365c0 119.637-97.887 217.524-217.524 217.524z", - "M533.561 320.796h150.528v146.963h-150.528v-146.963z", - "M737.583 320.796h150.528v146.963h-150.528v-146.963z", - "M125.44 534.111h150.528v146.963h-150.528v-146.963z", - "M329.5 534.111h150.528v146.963h-150.528v-146.963z", - "M533.561 534.111h150.528v146.963h-150.528v-146.963z", - "M737.583 534.111h150.528v146.963h-150.528v-146.963z", - "M275.968 894.407v-146.963h-150.528c0 82.887 83.209 146.963 150.528 146.963z", - "M329.5 747.444h150.528v146.963h-150.528v-146.963z", - "M533.561 747.444h150.528v146.963h-150.528v-146.963z" - ], - "grid": 0, - "tags": [ - "calendar" - ] - }, - "properties": { - "order": 15, - "id": 0, - "prevSize": 32, - "code": 58894, - "name": "calendar", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M508.207 66.882c-244.452 0-442.615 198.163-442.615 442.615 0 244.452 198.163 442.615 442.615 442.615 244.471 0 442.615-198.163 442.615-442.615-0-244.452-198.201-442.615-442.615-442.615zM164.485 424.467l-22.414-22.414c22.225-75.928 67.508-141.862 127.526-190.18l34.266 127.829c-53.134 17.010-100.712 46.364-139.378 84.764zM409.335 764.188c-52.679 0-95.384-42.705-95.384-95.403 0-9.956 1.972-19.38 4.798-28.425l-111.426-172.677 174.364 110.327c8.799-2.693 17.958-4.551 27.648-4.551 52.66 0 95.346 42.705 95.346 95.327 0 52.698-42.686 95.403-95.346 95.403zM409.335 323.205c-23.571 0-46.554 2.408-68.779 6.884l-38.116-142.241c59.335-38.153 129.934-60.283 205.767-60.283 35.992 0 70.751 5.139 103.765 14.45l-83.778 202.278c-37.111-13.502-77.065-21.087-118.86-21.087zM731.932 540.52c-32.18-79.189-92.615-143.834-168.77-181.476l84.897-204.971c131.641 51.883 227.48 174.839 240.375 321.612l-156.501 64.834z" - ], - "grid": 0, - "tags": [ - "beginner" - ] - }, - "properties": { - "order": 16, - "id": 0, - "prevSize": 32, - "code": 58895, - "name": "beginner", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M508.207 66.882c-244.452 0-442.615 198.163-442.615 442.615 0 244.452 198.163 442.615 442.615 442.615 244.471 0 442.615-198.163 442.615-442.615-0-244.452-198.201-442.615-442.615-442.615zM508.207 127.583c35.992 0 70.751 5.139 103.765 14.45l-83.778 202.278c-37.092-13.521-77.047-21.087-118.86-21.087-23.571 0-46.554 2.408-68.779 6.884l-38.116-142.241c59.335-38.153 129.934-60.283 205.767-60.283zM164.485 424.467l-22.414-22.414c22.225-75.928 67.508-141.862 127.526-190.18l34.266 127.829c-53.134 17.010-100.712 46.364-139.378 84.764zM502.253 647.964c1.498 6.713 2.427 13.653 2.427 20.821 0 52.698-42.686 95.403-95.346 95.403-52.679 0-95.384-42.705-95.384-95.403 0-52.622 42.705-95.327 95.384-95.327 12.459 0 24.292 2.56 35.195 6.884l169.851-109.625-112.128 177.247zM731.932 540.52c-32.18-79.189-92.615-143.834-168.77-181.476l84.897-204.971c131.641 51.883 227.48 174.839 240.375 321.612l-156.501 64.834z" - ], - "grid": 0, - "tags": [ - "advanced" - ] - }, - "properties": { - "order": 17, - "id": 0, - "prevSize": 32, - "code": 58896, - "name": "advanced", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M772.741-2.37h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM197.215 189.212h279.078v-61.231h71.149v61.231h286.189v194.75h-286.189v61.668h-71.149v-61.687h-279.078l-103.329-96.18 103.329-98.551zM824.149 701.175h-276.708v255.64h-71.149v-255.64h-281.448v-193.517h629.305l103.367 97.337-103.367 96.18z" - ], - "grid": 0, - "tags": [ - "sitemap" - ] - }, - "properties": { - "order": 18, - "id": 0, - "prevSize": 32, - "code": 58897, - "name": "sitemap", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M190.843 190.445c-78.431 78.507-78.431 205.577-0.038 284.027 78.412 78.374 205.596 78.412 284.008-0.019s78.412-205.559-0.038-283.951c-78.374-78.431-205.521-78.431-283.932-0.057zM442.216 358.343c-0.095-75.34-60.966-136.211-136.23-136.306v-26.795c90.055 0 163.025 73.045 163.1 163.119h-26.871zM770.37-0.019h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM944.242 838.447l-104.695 104.676c-15.663 15.701-41.169 15.663-56.87-0.019l-253.421-253.421c-15.701-15.72-15.701-41.188 0-56.908l27.781-27.781-61.857-61.876c-104.448 80.668-254.843 73.311-350.587-22.433-103.993-103.974-103.993-272.517 0-376.491 103.955-103.936 272.517-103.936 376.491 0.019 95.441 95.46 103.007 245.286 23.078 349.677l61.971 61.952 27.8-27.8c15.72-15.663 41.207-15.644 56.908 0l253.402 253.44c15.72 15.758 15.739 41.244 0 56.965z" - ], - "grid": 0, - "tags": [ - "search" - ] - }, - "properties": { - "order": 19, - "id": 0, - "prevSize": 32, - "code": 58898, - "name": "search", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M190.843 190.445c-78.431 78.507-78.431 205.577-0.038 284.027 78.412 78.374 205.596 78.412 284.008-0.019s78.412-205.559-0.038-283.951c-78.374-78.431-205.521-78.431-283.932-0.057zM442.216 358.343c-0.095-75.34-60.966-136.211-136.23-136.306v-26.795c90.055 0 163.025 73.045 163.1 163.119h-26.871zM944.242 838.447l-104.695 104.676c-15.663 15.701-41.169 15.663-56.87-0.019l-253.421-253.421c-15.701-15.72-15.701-41.188 0-56.908l27.781-27.781-61.857-61.876c-104.448 80.668-254.843 73.311-350.587-22.433-103.993-103.974-103.993-272.517 0-376.491 103.955-103.936 272.517-103.936 376.491 0.019 95.441 95.46 103.007 245.286 23.078 349.677l61.971 61.952 27.8-27.8c15.72-15.663 41.207-15.644 56.908 0l253.402 253.44c15.72 15.758 15.739 41.244 0 56.965z" - ], - "grid": 0, - "tags": [ - "search-alt" - ] - }, - "properties": { - "order": 20, - "id": 0, - "prevSize": 32, - "code": 58899, - "name": "search-alt", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M607.991 863.573c20.309 0 36.788-16.744 36.788-37.509 0-20.632-16.479-37.262-36.788-37.262-20.29 0-36.807 16.631-36.807 37.262 0 20.764 16.517 37.509 36.807 37.509zM418.475 151.249c-20.328 0-36.826 16.858-36.826 37.528 0 20.613 16.498 37.3 36.826 37.3 20.309 0 36.864-16.687 36.845-37.3-0-20.67-16.555-37.528-36.845-37.528zM772.741-2.37h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.038 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM285.279 609.735v89.714h-67.47c-57.079 0-90.377-41.434-104.334-99.556-18.849-78.014-18.053-124.719 0-199.509 15.607-65.195 65.593-99.537 122.652-99.537h269.995v-24.917h-196.343v-74.847c0-56.623 15.113-87.305 98.152-101.983 28.179-5.025 60.245-7.87 93.81-8.021 33.583-0.171 68.57 2.389 102.305 8.021 53.267 8.856 98.152 48.83 98.152 101.964v186.956c0 54.803-43.596 99.802-98.152 99.802h-196.134c-66.541 0.019-122.633 57.135-122.633 121.913zM912.991 614.438c-19.816 59.733-41.112 99.556-98.152 99.556h-294.21v24.879h196.077v74.828c0 56.642-48.735 85.466-98.152 99.783-74.373 21.542-133.973 18.242-196.115 0-51.902-15.284-98.133-46.573-98.133-99.783v-186.899c0-53.779 44.411-99.764 98.133-99.764h196.096c65.308 0 122.633-56.832 122.633-124.492v-87.173h73.69c57.116 0 84.044 42.761 98.152 99.518 19.627 78.943 20.48 138.069-0.019 199.547z" - ], - "grid": 0, - "tags": [ - "python" - ] - }, - "properties": { - "order": 21, - "id": 0, - "prevSize": 32, - "code": 58900, - "name": "python", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M653.672 373.077c-32.521 0-58.861 26.908-58.861 59.98 0 32.977 26.34 59.62 58.861 59.62 32.446 0 58.899-26.624 58.899-59.62 0-33.071-26.453-59.98-58.899-59.98zM393.216 373.077c-32.54 0-58.88 26.908-58.88 59.98 0 32.977 26.34 59.62 58.88 59.62 32.351 0 58.88-26.624 58.88-59.62 0-33.071-26.529-59.98-58.88-59.98zM772.741-0.019h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM853.807 399.474c0 32.275-4.248 60.568-12.117 85.694l-2.882 9.14c-1.517 4.21-3.413 8.533-5.367 12.933l-4.229 9.083c-33.849 67.413-101.812 105.472-198.58 120.396l-11.719 1.801 7.927 8.761c19.361 21.39 28.843 43.653 30.303 67.47v171.672c0.057 13.502 5.404 24.614 13.672 33.887-34.854-2.313-58.785-15.227-58.823-37.054v-143.019c0-18.773-17.73-20.518-20.006-20.518-0.796 0-1.441 0.114-1.877 0.209l-4.798 1.176v5.006c0 0 0 153.6 0 169.586-0.19 11.928 2.465 22.509 9.178 31.801-38.381-1.877-53.267-19.589-53.855-40.695 0 0.038 0-147.949 0-156.331 0-8.306-7.471-12.667-13.047-12.667-5.784 0-13.16 4.399-13.16 12.667-0.038 8.268-0.038 164.087-0.038 164.087-0.74 23.097-24.102 31.801-56.548 32.787 5.158-7.301 9.254-16.194 9.235-28.065v-180.053l-6.808 0.531c-0.171 0-19.001 1.365-19.589 20.461v146.792c-0.057 18.318-21.011 36.75-54.405 38.4 6.428-8.078 10.335-18.375 10.202-30.663v-119.182h-57.742c-107.179 1.138-101.224-97.261-162.854-146.66 56.737 6.713 80.801 85.845 155.003 87.685 45.359 0 56.623 0 56.623 0h5.575l0.702-5.537c3.3-25.335 15.55-47.388 39.367-66.807l11.681-9.576-14.905-1.669c-105.946-12.629-176.981-51.655-213.883-117.153l-5.082-9.121c-1.953-3.906-3.812-8.363-5.727-13.028l-3.565-9.14c-9.633-26.624-14.943-57.135-15.436-91.61-0.019-1.46-0.019-2.788-0.019-4.172 0.057-58.482 16.194-110.345 56.908-153.562l2.446-2.655-0.891-3.356c-5.348-20.196-7.813-40.505-7.889-60.928 0.038-24.804 3.812-49.778 10.923-75.055 46.364 2.958 93.544 19.342 141.919 52.034l2.219 1.46 2.655-0.569c39.633-8.647 79.379-12.705 119.068-12.705 41.036 0 82.072 4.38 123.089 12.705l2.731 0.512 2.257-1.555c41.358-29.374 87.381-46.611 138.847-51.712 8.495 28.786 13.464 57.534 13.464 86.13 0 12.971-0.967 25.96-3.148 38.969l-0.436 2.788 1.82 2.238c37.395 46.156 60.928 101.205 61.705 172.544-0.133 1.081-0.095 2.276-0.095 3.413z" - ], - "grid": 0, - "tags": [ - "github" - ] - }, - "properties": { - "order": 22, - "id": 0, - "prevSize": 32, - "code": 58901, - "name": "github", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M511.924 578.37c33.489 0 60.7-24.367 60.7-63.147v-445.8c0-38.836-27.231-63.109-60.7-63.109-33.527 0-60.681 24.273-60.681 63.109v445.8c0 38.779 27.174 63.147 60.681 63.147zM703.924 104.107v146.015c95.554 62.407 158.853 169.965 158.853 292.599 0 193.214-156.691 349.886-349.98 349.886-193.308 0-350.018-156.672-350.018-349.886 0-122.292 62.957-229.623 158.056-292.124v-146.053c-168.77 74.012-286.853 242.157-286.853 438.272 0 264.439 214.376 478.815 478.815 478.815 264.42 0 478.796-214.376 478.796-478.815 0-196.418-118.424-364.904-287.668-438.708z" - ], - "grid": 0, - "tags": [ - "get-started" - ] - }, - "properties": { - "order": 23, - "id": 0, - "prevSize": 32, - "code": 58902, - "name": "get-started", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M770.37 0h-521.481c-138.202 0-251.259 113.057-251.259 251.259v521.481c0 138.183 113.057 251.259 251.259 251.259h521.481c138.183 0 251.259-113.076 251.259-251.259v-521.481c0-138.202-113.076-251.259-251.259-251.259zM299.255 842.183c-65.043 0-117.76-52.698-117.76-117.741s52.717-117.741 117.76-117.741c65.005 0 117.722 52.698 117.722 117.741s-52.736 117.741-117.722 117.741zM611.745 827.923h-145.351c18.679-30.113 29.62-65.479 29.62-103.481 0-108.658-88.102-196.817-196.76-196.817-39.993 0-77.084 12.004-108.146 32.484v-146.508c33.906-11.795 70.182-18.565 108.146-18.66 181.931 0.322 329.14 147.551 329.463 329.481-0.095 36.162-6.163 70.903-16.972 103.5zM843.036 827.923h-149.030c8.666-33.109 13.786-67.698 13.786-103.519-0.057-225.64-182.936-408.5-408.519-408.519-37.528 0-73.633 5.48-108.146 14.943v-149.352c34.987-6.903 71.111-10.638 108.146-10.638 305.759 0 553.567 247.865 553.567 553.567-0.019 35.366-3.508 69.973-9.804 103.519z" - ], - "grid": 0, - "tags": [ - "feed" - ] - }, - "properties": { - "order": 24, - "id": 0, - "prevSize": 32, - "code": 58903, - "name": "feed", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M772.741-2.37h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM677.812 507.563h-105.453v381.952h-157.999v-381.952h-79v-131.622h79v-79.038c0-107.368 44.601-171.255 171.179-171.255h105.472v131.641h-65.896c-49.323 0-52.584 18.413-52.584 52.717l-0.19 65.934h119.448l-13.976 131.622z" - ], - "grid": 0, - "tags": [ - "facebook" - ] - }, - "properties": { - "order": 25, - "id": 0, - "prevSize": 32, - "code": 58904, - "name": "facebook", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M896 188.056h-772.741c-69.101 0-125.63 56.529-125.63 125.63v5.177l509.63 253.193 514.37-255.545v-2.825c0-69.101-56.529-125.63-125.63-125.63zM1021.63 635.032v-252.169l-253.175 125.781 253.175 126.388zM-2.37 385.233v248.225l249.211-124.416-249.211-123.809zM507.259 638.426l-192.341-95.554-317.269 157.582c0.209 68.93 56.642 125.231 125.611 125.231h772.741c68.437 0 124.492-55.505 125.535-123.714l-321.138-159.497-193.138 95.953z" - ], - "grid": 0, - "tags": [ - "email" - ] - }, - "properties": { - "order": 26, - "id": 0, - "prevSize": 32, - "code": 58905, - "name": "email", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M770.37-2.37h-521.481c-138.183 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.076 251.259 251.259 251.259h521.481c138.202 0 251.278-113.057 251.278-251.259v-521.481c0-138.183-113.076-251.259-251.278-251.259zM705.252 507.885v320.057h-382.066v-320.057h-190.255l380.094-382.824 383.166 382.824h-190.938z" - ], - "grid": 0, - "tags": [ - "arrow-up" - ] - }, - "properties": { - "order": 27, - "id": 0, - "prevSize": 32, - "code": 58906, - "name": "arrow-up", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M770.37-2.37h-521.481c-138.221 0-251.259 113.076-251.259 251.259v521.481c0 138.183 113.038 251.259 251.259 251.259h521.481c138.183 0 251.259-113.076 251.259-251.259v-521.481c0-138.183-113.076-251.259-251.259-251.259zM511.374 896.19v-190.938h-320.076v-382.066h320.076v-190.255l382.824 380.075-382.824 383.185z" - ], - "grid": 0, - "tags": [ - "arrow-right" - ] - }, - "properties": { - "order": 28, - "id": 0, - "prevSize": 32, - "code": 58907, - "name": "arrow-right", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M770.37-2.389h-521.481c-138.183 0-251.259 113.076-251.259 251.278v521.481c0 138.183 113.076 251.259 251.259 251.259h521.481c138.221 0 251.259-113.076 251.259-251.259v-521.481c0-138.202-113.038-251.278-251.259-251.278zM827.961 696.073h-320.076v190.255l-382.824-380.094 382.824-383.166v190.919h320.076v382.085z" - ], - "grid": 0, - "tags": [ - "arrow-left" - ] - }, - "properties": { - "order": 29, - "id": 0, - "prevSize": 32, - "code": 58908, - "name": "arrow-left", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M770.389-2.37h-521.481c-138.202 0-251.278 113.038-251.278 251.259v521.481c0 138.183 113.076 251.259 251.278 251.259h521.481c138.183 0 251.259-113.076 251.259-251.259v-521.481c0-138.221-113.076-251.259-251.259-251.259zM506.254 894.18l-383.166-382.805h190.9v-320.076h382.085v320.076h190.255l-380.075 382.805z" - ], - "grid": 0, - "tags": [ - "arrow-down" - ] - }, - "properties": { - "order": 30, - "id": 0, - "prevSize": 32, - "code": 58909, - "name": "arrow-down", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M772.741-2.37h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.038 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM309.627 826.273c-99.859 0-180.812-80.953-180.812-180.793 0-99.821 80.953-180.774 180.812-180.774 27.364 0 53.267 6.277 76.535 17.18l-54.689 94.701c-6.884-2.238-14.241-3.451-21.845-3.451-39.936 0-72.325 32.37-72.325 72.306s32.389 72.344 72.325 72.344c35.537 0 65.062-25.714 71.111-59.506h109.037c-6.618 93.848-84.632 167.993-180.148 167.993zM438.234 306.593c0 19.456 7.737 37.035 20.215 50.081l-55.068 95.308c-44.563-32.92-73.652-85.694-73.652-145.389 0-99.821 80.953-180.774 180.812-180.774 99.84 0 180.774 80.934 180.774 180.774 0 59.582-28.937 112.318-73.406 145.237l-55.049-95.384c12.364-13.009 20.044-30.492 20.044-49.854 0-39.936-32.446-72.325-72.344-72.325-39.936 0-72.325 32.389-72.325 72.325zM708.475 826.216c-95.554 0-173.549-74.145-180.148-167.955h109.037c6.030 33.83 35.556 59.525 71.111 59.525 39.898 0 72.287-32.37 72.287-72.325 0-39.917-32.37-72.287-72.287-72.287-6.599 0-12.99 0.967-19.039 2.636l-54.917-95.175c22.585-10.145 47.597-15.948 73.956-15.948 99.859 0 180.774 80.934 180.774 180.755s-80.915 180.774-180.774 180.774z" - ], - "grid": 0, - "tags": [ - "freenode" - ] - }, - "properties": { - "order": 31, - "id": 0, - "prevSize": 32, - "code": 58910, - "name": "freenode", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M990.701 763.98l-336.175-688.014c-58.69-104.41-224.616-92.558-269.483-1.214l-345.353 690.479c-74.828 142.279-0.929 258.769 164.162 258.769h620.165c165.073 0 240.090-117.020 166.684-260.020zM607.744 891.259h-185.401v-189.573h185.401v189.573zM610.057 384l-33.716 253.080h-122.728l-33.185-253.080v-192h189.63v192z" - ], - "grid": 0, - "tags": [ - "alert" - ] - }, - "properties": { - "order": 32, - "id": 0, - "prevSize": 32, - "code": 58911, - "name": "alert", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M61.554 313.685l450.37-187.259 445.63 187.259-445.63 189.63z", - "M511.924 569.666l-297.415-125.212-152.955 63.602 450.37 189.611 445.63-189.611-151.343-63.602z", - "M511.924 761.666l-297.415-125.231-152.955 63.602 450.37 189.63 445.63-189.63-151.343-63.602z" - ], - "grid": 0, - "tags": [ - "versions" - ] - }, - "properties": { - "order": 33, - "id": 0, - "prevSize": 32, - "code": 58912, - "name": "versions", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M688.583 286.227c-24.728 0-44.715 20.461-44.715 45.587 0 25.012 19.987 45.246 44.715 45.246 24.595 0 44.753-20.252 44.734-45.246 0.019-25.126-20.139-45.587-44.734-45.587zM772.741-2.37h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM816.488 392.021c10.449 231.519-162.588 475.136-468.158 475.136-92.956 0-179.428-27.269-252.302-73.937 87.324 10.278 174.497-13.995 243.674-68.134-72.002-1.365-132.836-48.962-153.771-114.328 25.79 4.93 51.181 3.489 74.354-2.769-79.132-15.929-133.803-87.268-132.001-163.499 22.168 12.288 47.597 19.759 74.562 20.556-73.311-48.962-94.094-145.768-50.972-219.705 81.18 99.537 202.505 165.092 339.285 171.918-24.064-102.912 54.101-202.107 160.275-202.107 47.369 0 90.112 20.025 120.187 52.034 37.509-7.396 112.924-60.833 144.706-79.682-12.288 38.438-78.26 119.353-112.299 139.7 33.375-3.944 92.786 5.613 122.292-7.509-22.092 33.015-77.596 49.133-109.833 72.325z" - ], - "grid": 0, - "tags": [ - "twitter" - ] - }, - "properties": { - "order": 34, - "id": 0, - "prevSize": 32, - "code": 58913, - "name": "twitter", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M770.37-0.019h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM382.028 837.385c-11.169 5.329-34.076 3.375-54.537 3.375h-114.65c-35.631 0-68.191 1.517-75.7-23.381-6.106-20.271-1.119-64.645-1.119-89.050v-180.319c0-42.856-9.273-100.58 23.362-110.213 11.548-3.432 31.744-1.1 46.763-1.1h47.863c44.297 0 91.913-7.111 109.682 15.113l34.114 364.961c-2.484 8.875-7.377 16.631-15.777 20.613zM857.335 628.11c34.816 21.656 18.413 91.231-14.488 102.419 19.475 16.194 13.103 52.527 0 67.906-45.796 53.779-181.305 37.831-284.937 37.831-23.438 0-48.109 2.788-64.55 0-15.246-2.617-26.662-11.264-38.381-19.589l-35.252-377.268c6.163-10.714 11.89-21.751 14.658-26.131 21.883-34.683 44.582-68.248 73.444-93.506 14.829-12.971 32.635-20.271 51.219-32.275 23.324-15.095 56.699-58.615 60.113-93.487 1.384-14.526-2.882-39.481 3.319-52.357 5.803-11.947 29.715-27.572 50.119-21.125 23.59 7.452 42.174 45.435 44.544 75.719 2.332 30.549-3.11 62.995-15.607 83.437-13.464 22.035-28.236 30.587-36.731 47.863-7.49 15.208-9.956 28.046-12.25 52.319 79.929 4.855 201.216-13.388 233.775 41.188 17.446 29.26-6.22 85.257-30.075 96.825 43.899 14.715 42.344 93.62 1.081 110.232zM258.181 686.478c-26.188 0-47.332 21.618-47.332 48.223 0 26.491 21.144 47.919 47.332 47.919 26.036 0 47.351-21.428 47.351-47.919-0-26.605-21.314-48.223-47.351-48.223z" - ], - "grid": 0, - "tags": [ - "thumbs-up" - ] - }, - "properties": { - "order": 35, - "id": 0, - "prevSize": 32, - "code": 58914, - "name": "thumbs-up", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M248.889 1024h521.481c138.202 0 251.259-113.076 251.259-251.259v-521.481c0-138.202-113.057-251.278-251.259-251.278h-521.481c-138.183 0-251.259 113.076-251.259 251.278v521.481c0 138.183 113.076 251.259 251.259 251.259zM637.231 186.596c11.169-5.329 34.076-3.375 54.537-3.375h114.65c35.631 0 68.191-1.517 75.7 23.381 6.106 20.271 1.119 64.645 1.119 89.050v180.319c0 42.856 9.254 100.58-23.362 110.213-11.548 3.432-31.744 1.1-46.763 1.1h-47.863c-44.297 0-91.932 7.092-109.682-15.113l-34.114-364.961c2.484-8.875 7.358-16.631 15.777-20.613zM161.925 395.871c-34.816-21.656-18.413-91.231 14.488-102.419-19.475-16.194-13.103-52.527 0-67.906 45.796-53.779 181.305-37.831 284.937-37.831 23.438 0 48.109-2.788 64.55 0 15.246 2.617 26.643 11.264 38.381 19.589l35.252 377.268c-6.163 10.714-11.89 21.751-14.658 26.131-21.883 34.683-44.582 68.248-73.444 93.506-14.829 12.971-32.635 20.271-51.219 32.275-23.324 15.095-56.699 58.615-60.113 93.487-1.384 14.526 2.882 39.481-3.319 52.357-5.803 11.947-29.715 27.572-50.119 21.125-23.59-7.452-42.174-45.435-44.544-75.719-2.332-30.549 3.11-62.995 15.607-83.437 13.464-22.035 28.236-30.587 36.731-47.863 7.49-15.208 9.956-28.046 12.25-52.319-79.929-4.855-201.216 13.388-233.775-41.188-17.446-29.26 6.22-85.257 30.075-96.825-43.899-14.715-42.344-93.62-1.081-110.232zM761.079 512.815c26.188 0 47.332-21.618 47.332-48.223 0-26.491-21.144-47.919-47.332-47.919-26.036 0-47.351 21.428-47.351 47.919 0 26.605 21.314 48.223 47.351 48.223z" - ], - "grid": 0, - "tags": [ - "thumbs-down" - ] - }, - "properties": { - "order": 36, - "id": 0, - "prevSize": 32, - "code": 58915, - "name": "thumbs-down", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M630.139 539.212h124.511l-61.668-234.837-62.843 234.837zM231.993 596.082h64.076l-31.611-147.399-32.465 147.399zM772.741-0.019h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM344.955 763.354l-27.989-95.782h-106.97l-29.639 95.782h-88.235l135.604-422.798h72.306l131.736 422.798h-86.812zM820.452 764.321l-37.66-128.872h-182.234l-39.898 128.872h-99.631l182.5-568.984h97.318l177.304 568.984h-97.697z" - ], - "grid": 0, - "tags": [ - "text-resize" - ] - }, - "properties": { - "order": 37, - "id": 0, - "prevSize": 32, - "code": 58916, - "name": "text-resize", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M593.427 476.824l128.91-93.867h-152.292l-58.482-140.383-46.895 140.383h-152.102l128.74 93.867-58.615 163.859 128.872-105.396 128.683 105.396-46.82-163.859zM479.327 865.754c-12.535-1.271-24.86-3.167-36.997-5.613 7.073-44.146-1.764-89.695-16.498-124.511-15.607-35.157-33.849-51.333-57.192-54.177-18.489 38.153-29.582 81.408-16.308 120.282 5.158 16.137 14.45 29.449 26.207 39.671-41.719-16.194-79.796-39.519-113.076-68.267 22.812-30.208 36.978-67.186 41.908-100.902 4.741-36.807-2.2-61.402-19.191-78.412-30.417 20.992-57.116 51.086-64.455 90.491-3.527 17.048-2.503 33.773 1.801 49.019-22.206-25.638-41.131-54.101-56.092-84.935 28.236-13.843 51.731-39.177 66.238-67.584 14.791-30.398 16.251-57.742 7.945-83.437-29.961 2.996-59.62 17.105-77.122 48.811-10.638 18.413-14.962 40.183-13.824 61.478-14.127-40.258-22.168-83.399-22.168-128.493 0-6.618 0.531-13.103 0.853-19.646 25.998 3.508 52.698-5.803 74.183-24.026 22.528-20.063 34.456-46.061 39.31-75.34-23.192-13.179-50.991-15.455-76.724 4.134-12.25 8.913-22.225 21.921-29.544 36.978 8.325-40.865 22.831-79.493 42.894-114.593 18.148 16.005 42.837 20.499 69.044 13.767 28.027-7.851 52.11-26.719 74.088-50.574-11.093-21.732-33.052-36.257-64.645-30.91-16.194 2.295-32.465 9.956-47.028 21.371 24.595-31.479 53.893-58.994 86.907-81.617 9.69 17.92 30.644 27.553 60.226 27.667 31.953-0.474 68.191-11.074 107.501-24.595-0.076-19.646-17.692-36.409-54.632-39.974-17.863-2.105-37.755-0.171-57.325 5.101 26.889-12.497 55.315-22.281 85.125-28.388 8.875-1.839 14.583-10.468 12.781-19.342-1.839-8.875-10.468-14.583-19.342-12.781-24.595 5.044-48.375 12.269-71.206 21.39 9.406-6.751 18.508-13.634 26.984-20.651 30.758-24.538 45.189-46.459 35.821-64.512-55.334 7.433-104.638 31.004-130.522 60.738-22.964 27.288-24.102 51.693-13.786 68.267-30.929 21.182-58.918 46.251-83.153 74.695 5.385-11.7 10.297-23.514 13.995-35.518 11.34-35.233 10.031-64-6.903-81.56-39.045 24.424-68.551 64.417-76.079 103.424-6.542 36.466 5.329 62.445 24.329 76.667-20.385 35.404-35.385 74.202-44.809 115.124-1.517-14.962-3.982-29.772-8.344-44.070-10.543-35.631-29.355-60.113-55.031-66.844-19.608 41.169-24.311 91.212-10.012 128.133 13.426 33.849 37.945 49 63.431 50.953-0.55 8.799-1.176 17.598-1.176 26.529 0 40.638 5.803 79.91 16.536 117.077-7.396-9.766-15.436-19.058-25.012-27.117-27.117-23.381-58.311-32.939-87.704-23.040-0.076 47.18 17.958 93.431 48.981 115.845 29.62 20.992 62.123 16.915 89.41 0.607 21.713 44.772 51.124 85.011 86.509 119.239-20.366-15.986-44.525-26.377-72.761-29.696-37.092-4.722-73.652 5.215-101.205 31.991 17.427 43.71 54.367 75.985 95.706 77.748 42.060 1.422 76.023-26.169 97.811-61.762-1.062-1.176-2.2-2.219-3.3-3.356 44.734 38.969 97.564 68.93 155.913 86.319-25.998 1.062-51.75 7.964-77.483 21.732-38.628 20.442-69.006 53.039-81.806 94.265 40.031 26.377 95.516 30.53 138.505 5.139 41.434-24.841 59.525-68.077 61.497-111.332 12.079 2.332 24.311 4.248 36.75 5.499 0.55 0.057 1.1 0.076 1.65 0.076 8.306 0 15.436-6.258 16.289-14.715 0.872-8.988-5.689-17.048-14.677-17.939zM934.817 569.154c-9.595 8.078-17.673 17.37-25.050 27.174 10.752-37.186 16.536-76.478 16.555-117.134 0-8.951-0.626-17.749-1.176-26.548 25.505-1.953 50.024-17.086 63.469-50.953 14.298-36.921 9.595-86.945-10.012-128.133-25.676 6.732-44.506 31.213-55.031 66.844-4.38 14.317-6.827 29.165-8.306 44.127-9.425-40.96-24.443-79.777-44.828-115.2 19.001-14.222 30.891-40.201 24.348-76.686-7.509-39.007-37.035-79-76.079-103.424-16.953 17.56-18.242 46.327-6.903 81.56 3.679 12.023 8.609 23.874 14.014 35.593-24.235-28.482-52.243-53.589-83.191-74.771 10.335-16.574 9.178-40.979-13.786-68.267-25.884-29.734-75.188-53.305-130.522-60.738-9.368 18.053 5.063 39.974 35.821 64.512 8.495 7.035 17.636 13.919 27.060 20.708-22.869-9.121-46.668-16.384-71.301-21.409-8.875-1.839-17.541 3.906-19.361 12.781-1.801 8.837 3.925 17.503 12.8 19.323 29.81 6.106 58.216 15.872 85.125 28.388-19.57-5.272-39.462-7.187-57.325-5.101-36.94 3.565-54.556 20.328-54.632 39.974 39.31 13.502 75.548 24.102 107.501 24.595 29.582-0.114 50.536-9.747 60.226-27.667 32.958 22.604 62.236 50.1 86.831 81.541-14.564-11.378-30.815-19.001-46.971-21.314-31.592-5.329-53.551 9.197-64.645 30.91 21.978 23.874 46.080 42.724 74.088 50.574 26.188 6.732 50.897 2.238 69.025-13.748 20.044 35.081 34.532 73.652 42.856 114.479-7.32-15.019-17.256-27.989-29.487-36.883-25.714-19.589-53.532-17.313-76.724-4.134 4.855 29.279 16.801 55.277 39.31 75.34 21.466 18.204 48.166 27.534 74.145 24.045 0.341 6.542 0.872 13.028 0.872 19.646 0 45.056-8.040 88.14-22.13 128.398 1.119-21.276-3.224-43.027-13.824-61.383-17.522-31.706-47.161-45.815-77.122-48.811-8.306 25.695-6.846 53.058 7.945 83.437 14.507 28.407 37.983 53.741 66.2 67.584-14.943 30.796-33.868 59.24-56.055 84.859 4.305-15.208 5.31-31.934 1.801-48.943-7.358-39.405-34.039-69.499-64.455-90.491-16.991 16.991-23.931 41.586-19.191 78.412 4.93 33.716 19.115 70.694 41.889 100.883-33.28 28.748-71.339 52.053-113.038 68.267 11.757-10.221 21.011-23.514 26.188-39.652 13.255-38.874 2.162-82.129-16.308-120.282-23.324 2.844-41.567 19.039-57.192 54.177-14.715 34.816-23.571 80.365-16.479 124.511-12.174 2.427-24.5 4.343-37.035 5.613-9.026 0.91-15.55 8.951-14.639 17.977 0.872 8.439 8.021 14.734 16.327 14.734 0.531 0 1.1-0.038 1.65-0.095v-0.038c12.421-1.252 24.671-3.167 36.75-5.499 1.972 43.255 20.063 86.49 61.478 111.332 42.989 25.391 98.456 21.22 138.505-5.139-12.819-41.225-43.179-73.823-81.806-94.265-25.733-13.786-51.503-20.689-77.521-21.732 58.425-17.427 111.313-47.407 156.084-86.471-1.157 1.176-2.332 2.276-3.451 3.508 21.788 35.593 55.751 63.185 97.811 61.762 41.339-1.764 78.279-34.039 95.706-77.748-27.553-26.757-64.114-36.712-101.205-31.991-28.274 3.356-52.489 13.748-72.875 29.772 35.404-34.247 64.872-74.505 86.585-119.334 27.288 16.289 59.771 20.404 89.429-0.588 31.023-22.433 49.057-68.665 48.981-115.845-29.412-9.88-60.606-0.322-87.723 23.078z" - ], - "grid": 0, - "tags": [ - "success-stories" - ] - }, - "properties": { - "order": 38, - "id": 0, - "prevSize": 32, - "code": 58917, - "name": "success-stories", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M124.113 449.574h132.741v385.574h-132.741v-385.574z", - "M250.539 1023.204h521.481c93.127 0 174.668-51.465 218.055-127.241h-957.611c43.387 75.776 124.947 127.241 218.074 127.241z", - "M336.915 196.741h132.741v638.426h-132.741v-638.426z", - "M549.736 323.148h132.741v512h-132.741v-512z", - "M762.539 1.574h132.741v833.574h-132.741v-833.574z" - ], - "grid": 0, - "tags": [ - "statistics" - ] - }, - "properties": { - "order": 39, - "id": 0, - "prevSize": 32, - "code": 58918, - "name": "statistics", - "ligatures": "" - } - }, - { - "icon": { - "paths": [ - "M772.741-2.37h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM376.055 250.842l269.065 175.066-36.693 57.989-273.484-168.107 41.112-64.948zM295.291 404.082l307.352 92.748-18.982 65.953-309.627-84.764 21.257-73.937zM260.437 551.064l319.052 35.821-6.789 68.248-319.848-27.553 7.585-76.516zM252.587 680.562h321.024v76.895h-321.024v-76.895zM698.804 890.558h-570.728v-351.118h65.517v290.873h441.799v-290.873h63.412v351.118zM653.047 419.176l-178.745-266.676 64.398-41.927 171.823 271.151-57.477 37.452zM717.577 378.709l-23.742-320.133 76.743-4.665 15.493 320.626-68.494 4.172z" - ], - "grid": 0, - "tags": [ - "stack-overflow" - ] - }, - "properties": { - "order": 40, - "id": 0, - "prevSize": 32, - "code": 58919, - "name": "stack-overflow", - "ligatures": "" - } - } - ], - "height": 1024, - "metadata": { - "name": "pythonicons" - } -} + "IcoMoonType": "selection", + "icons": [ + { + "icon": { + "paths": [ + "M1024 429.256c0-200.926-58.792-363.938-131.482-365.226 0.292-0.006 0.578-0.030 0.872-0.030h-82.942c0 0-194.8 146.336-475.23 203.754-8.56 45.292-14.030 99.274-14.030 161.502 0 62.228 5.466 116.208 14.030 161.5 280.428 57.418 475.23 203.756 475.23 203.756h82.942c-0.292 0-0.578-0.024-0.872-0.032 72.696-1.288 131.482-164.298 131.482-365.224zM864.824 739.252c-9.382 0-19.532-9.742-24.746-15.548-12.63-14.064-24.792-35.96-35.188-63.328-23.256-61.232-36.066-143.31-36.066-231.124 0-87.81 12.81-169.89 36.066-231.122 10.394-27.368 22.562-49.266 35.188-63.328 5.214-5.812 15.364-15.552 24.746-15.552 9.38 0 19.536 9.744 24.744 15.552 12.634 14.064 24.796 35.958 35.188 63.328 23.258 61.23 36.068 143.312 36.068 231.122 0 87.804-12.81 169.888-36.068 231.124-10.39 27.368-22.562 49.264-35.188 63.328-5.208 5.806-15.36 15.548-24.744 15.548zM251.812 429.256c0-51.95 3.81-102.43 11.052-149.094-47.372 6.554-88.942 10.324-140.34 10.324-67.058 0-67.058 0-67.058 0l-55.466 94.686v88.17l55.46 94.686c0 0 0 0 67.060 0 51.398 0 92.968 3.774 140.34 10.324-7.236-46.664-11.048-97.146-11.048-149.096zM368.15 642.172l-127.998-24.51 81.842 321.544c4.236 16.634 20.744 25.038 36.686 18.654l118.556-47.452c15.944-6.376 22.328-23.964 14.196-39.084l-123.282-229.152zM864.824 548.73c-3.618 0-7.528-3.754-9.538-5.992-4.87-5.42-9.556-13.86-13.562-24.408-8.962-23.6-13.9-55.234-13.9-89.078 0-33.844 4.938-65.478 13.9-89.078 4.006-10.548 8.696-18.988 13.562-24.408 2.010-2.24 5.92-5.994 9.538-5.994 3.616 0 7.53 3.756 9.538 5.994 4.87 5.42 9.556 13.858 13.56 24.408 8.964 23.598 13.902 55.234 13.902 89.078 0 33.842-4.938 65.478-13.902 89.078-4.004 10.548-8.696 18.988-13.56 24.408-2.008 2.238-5.92 5.992-9.538 5.992z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "bullhorn", + "megaphone", + "announcement", + "advertisement", + "news" + ], + "grid": 16 + }, + "attrs": [], + "properties": { + "order": 1, + "id": 0, + "prevSize": 32, + "code": 58880, + "name": "bullhorn", + "ligatures": "" + }, + "setIdx": 0, + "setId": 0, + "iconIdx": 0 + }, + { + "icon": { + "paths": [ + "M620.62 12.098c-40.884-6.808-83.266-9.918-123.999-9.728-40.695 0.19-79.569 3.622-113.74 9.728-100.693 17.806-118.993 54.974-118.993 123.657v90.738h238.004v30.208h-327.282c-69.177 0-129.764 41.624-148.689 120.68-21.883 90.662-22.85 147.266 0 241.873 16.934 70.466 57.287 120.68 126.502 120.68h81.787v-108.753c0-78.583 68.001-147.797 148.67-147.797h237.739c66.143 0 118.955-54.556 118.955-120.984v-226.664c-0-64.455-54.405-112.905-118.955-123.639zM395.681 166.021c-24.671 0-44.658-20.215-44.658-45.227 0-25.050 19.987-45.473 44.658-45.473 24.557 0 44.658 20.423 44.658 45.473 0.019 24.993-20.082 45.227-44.658 45.227z", + "M995.157 394.923c-17.067-68.798-49.74-120.623-118.955-120.623h-89.335v105.662c0 82.034-69.48 150.945-148.67 150.945h-237.72c-65.119 0-118.974 55.732-118.974 120.927v226.588c0 64.493 56.073 102.438 118.974 120.946 75.34 22.13 147.589 26.131 237.739 0 59.885-17.332 118.993-52.281 118.993-120.946v-90.738h-237.701v-30.189h356.712c69.139 0 94.967-48.242 118.955-120.642 24.841-74.562 23.799-146.242-0.019-241.929zM625.417 848.194c24.652 0 44.639 20.177 44.639 45.189 0 25.145-19.987 45.454-44.639 45.454-24.614 0-44.658-20.309-44.658-45.454 0-24.993 20.063-45.189 44.658-45.189z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "python-alt" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 2, + "id": 0, + "prevSize": 24, + "code": 58881, + "name": "python-alt", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 0 + }, + { + "icon": { + "paths": [ + "M770.37-2.37h-521.481c-138.221 0-251.259 113.076-251.259 251.259v521.481c0 138.183 113.038 251.259 251.259 251.259h521.481c138.183 0 251.259-113.076 251.259-251.259v-521.481c0-138.183-113.076-251.259-251.259-251.259zM958.369 763.183c0 100.447-95.63 195.489-195.508 195.489h-502.348c-97.033 0-195.527-95.042-195.527-195.489v-65.479h893.364v65.479zM958.369 636.075h-893.364v-253.649h893.364v253.649zM958.369 320.796h-893.364v-59.999c0-96.446 96.104-195.489 195.527-195.489h502.348c99.878 0 195.508 99.044 195.508 195.489v59.999zM383.924 223.611h260.741v-61.63h-260.741v61.63zM644.665 479.611h-260.741v61.63h260.741v-61.63zM644.665 797.26h-260.741v61.63h260.741v-61.63z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "pypi" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 3, + "id": 1, + "prevSize": 24, + "code": 58882, + "name": "pypi", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 1 + }, + { + "icon": { + "paths": [ + "M957.63 189.212v574.805c0 94.853-64 128.531-64 128.531s0-730.624 0-895.962l-893.63 1.043v771.66c0 138.221 113.076 251.259 251.259 251.259h519.111c138.183 0 251.259-113.038 251.259-251.259v-580.286l-64 0.209zM831.393 930.74c0 0-25.998 23.514-72.59 23.514 0 0-426.515 1.157-497.436 1.157-91.041 0-196.058-97.527-196.058-192.891s0.967-700.094 0.967-700.094h765.118v868.314z", + "M770.37 173.511v-47.407h-636.833v125.63h636.833z", + "M133.537 378.937h315.24v65.574h-315.24v-65.574z", + "M133.537 761.363h635.24v65.574h-635.24v-65.574z", + "M133.537 506.937h315.24v65.574h-315.24v-65.574z", + "M133.537 632.567h315.24v65.574h-315.24v-65.574z", + "M770.37 630.215v-251.278h-259.963v320.019h259.963z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "news" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 4, + "id": 2, + "prevSize": 24, + "code": 58883, + "name": "news", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 2 + }, + { + "icon": { + "paths": [ + "M508.207 66.882c-244.452 0-442.615 198.163-442.615 442.615 0 244.452 198.163 442.615 442.615 442.615 244.471 0 442.615-198.163 442.615-442.615-0-244.452-198.201-442.615-442.615-442.615zM164.485 424.467l-22.414-22.414c22.225-75.928 67.508-141.862 127.526-190.18l34.266 127.829c-53.134 17.010-100.712 46.364-139.378 84.764zM409.335 764.188c-52.679 0-95.384-42.705-95.384-95.403 0-38.116 22.528-70.751 54.898-86.016l42.648-197.879 45.378 201.709c28.463 16.479 47.825 46.952 47.825 82.185-0.019 52.698-42.705 95.403-95.365 95.403zM409.335 323.205c-23.571 0-46.554 2.408-68.779 6.884l-38.116-142.241c59.335-38.153 129.934-60.283 205.767-60.283 35.992 0 70.751 5.139 103.765 14.45l-83.778 202.278c-37.111-13.502-77.065-21.087-118.86-21.087zM731.932 540.52c-32.18-79.189-92.615-143.834-168.77-181.476l84.897-204.971c131.641 51.883 227.48 174.839 240.375 321.612l-156.501 64.834z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "moderate" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 5, + "id": 3, + "prevSize": 24, + "code": 58884, + "name": "moderate", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 3 + }, + { + "icon": { + "paths": [ + "M855.249 128.341c23.211 0 42.78 19.608 42.78 42.78v680.941c0 23.211-19.57 42.78-42.78 42.78h-680.96c-23.192 0-42.78-19.57-42.78-42.78v-680.941c0-23.192 19.608-42.78 42.78-42.78h680.96M855.249 0h-680.96c-94.113 0-171.122 77.009-171.122 171.122v680.941c0 94.132 77.009 171.122 171.122 171.122h680.941c94.132 0 171.122-77.009 171.122-171.122v-680.941c0.019-94.094-76.99-171.122-171.103-171.122v0z", + "M421.812 682.401v-205.464h-118.519v205.464h-64.853v-464.915h64.853v203.321h118.519v-203.321h65.593v464.934h-65.593z", + "M666.131 839.054c-76.516 0-124.549-49.512-124.549-115.105 0-51.010 27.629-84.556 56.813-96.18l-29.886-32.047c0.702-21.144 16.043-40.789 32.047-49.55-26.226-19.646-42.249-48.792-42.249-90.321 0-64.152 41.51-110.099 104.922-110.099 15.322 0 26.965 2.219 35.707 5.12 10.942 3.622 22.604 5.803 37.129 5.803 16.043 0 31.346-5.803 40.088-11.605l8.761 51.75c-4.399 3.622-17.503 8.021-26.965 8.021 5.784 10.923 10.183 29.146 10.183 51.029 0 59.752-37.888 108.544-102.040 110.023-21.106 0-33.527 5.784-33.527 18.223 0 4.361 3.66 11.643 11.681 14.601l63.374 21.826c51.75 17.484 81.636 53.21 81.636 110.080 0.038 61.080-48.052 108.43-123.127 108.43zM690.195 671.497l-40.808-11.7c-31.308 2.939-51.75 26.245-51.75 64.834 0 33.545 22.604 65.65 67.755 65.65 43.748 0 65.612-30.625 65.612-59.733 0.019-27.743-13.843-51.75-40.808-59.051zM663.249 394.562c-27.743 0-48.090 26.965-48.090 61.25 0 34.949 20.347 61.175 48.090 61.175 26.226 0 48.773-26.226 48.773-61.175 0.019-34.285-20.347-61.25-48.773-61.25z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "mercurial" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 6, + "id": 4, + "prevSize": 24, + "code": 58885, + "name": "mercurial", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 4 + }, + { + "icon": { + "paths": [ + "M899.167 678.665l-291.499 50.157v29.412c0 45.151-50.498 81.655-94.872 81.655-44.582 0-94.834-36.504-94.834-81.655v-29.412l-291.537-50.157c-69.101 0-125.63-63.962-125.63-63.962v282.074c0 69.12 56.529 125.63 125.63 125.63h772.741c69.101 0 125.63-56.51 125.63-125.63v-282.074c0 0-56.529 63.962-125.63 63.962z", + "M899.167 254.369h-194.37v-66.37c0.19-36.030-11.397-69.367-35.366-92.35-23.893-23.059-57.079-33.413-92.634-33.28h-130.37c-35.593-0.114-68.779 10.221-92.653 33.28-24.007 22.983-35.556 56.32-35.366 92.35v66.37h-191.981c-69.101 0-125.63 56.529-125.63 125.63v128c0 69.12 56.529 125.63 125.63 125.63l339.039 56.168v52.338c0 26.491 21.163 47.938 47.332 47.938 26.055 0 47.369-21.447 47.369-47.938v-52.357l339.001-56.149c69.101 0 125.63-56.51 125.63-125.63v-128c0-69.101-56.529-125.63-125.63-125.63zM384.777 187.999c0.19-23.268 6.466-36.143 15.019-44.582 8.704-8.306 22.907-14.601 46.63-14.715h130.37c23.666 0.114 37.907 6.391 46.573 14.715 8.571 8.439 14.81 21.314 15.057 44.582-0.019 21.902-0.019 45.416-0.019 66.37h-253.63c0-20.954 0-44.468 0-66.37z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "jobs" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 7, + "id": 5, + "prevSize": 24, + "code": 58886, + "name": "jobs", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 5 + }, + { + "icon": { + "paths": [ + "M772.741-0.019h-521.481c-138.183 0-251.259 113.076-251.259 251.278v521.481c0 138.183 113.076 251.259 251.259 251.259h521.481c138.221 0 251.259-113.076 251.259-251.259v-521.481c0-138.202-113.038-251.278-251.259-251.278zM593.029 896.777h-185.401v-189.573h185.401v189.573zM748.791 409.429c-14.639 24.652-44.601 54.746-89.809 90.283-31.497 24.955-51.39 44.999-59.639 60.113-8.287 15.132-12.383 55.751-12.383 80.1h-177.778v-38.703c0-30.246 3.432-54.803 10.297-73.671 6.865-18.887 17.048-36.087 30.625-51.693 13.577-15.588 44.051-43.046 91.458-82.318 25.259-20.594 37.888-39.462 37.888-56.604s-5.082-30.473-15.208-39.993c-10.126-9.5-25.505-14.26-46.080-14.26-22.168 0-40.467 7.339-54.955 21.978-14.526 14.658-23.78 40.22-27.838 76.724l-181.495-22.452c6.239-66.731 30.473-120.453 72.742-161.166 42.268-40.695 107.046-61.042 194.351-61.042 68.001 0 122.861 14.184 164.693 42.572 56.737 38.362 85.106 89.505 85.106 153.429-0 26.51-7.301 52.072-21.978 76.705z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "help" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 8, + "id": 6, + "prevSize": 24, + "code": 63, + "name": "help", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 6 + }, + { + "icon": { + "paths": [ + "M129.271 383.507l383.166 382.805 380.075-382.805h-190.255v-320.076h-382.085v320.076z", + "M736.484 635.657l-224.047 225.47-225.375-225.185h-288.161v135.149c0 138.202 113.057 251.259 251.259 251.259h521.481c138.183 0 251.259-113.057 251.259-251.259v-135.149l-286.417-0.284z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "download" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 10, + "id": 7, + "prevSize": 24, + "code": 58889, + "name": "download", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 7 + }, + { + "icon": { + "paths": [ + "M731.439 149.751l-25.031 39.329-90.529-57.628-186.292 292.636 39.974 25.467 160.825-252.644 50.574 32.161-331.473 520.742 9.937 51.333-36.162 57.666 6.201 30.853 30.891-7.623 35.669-56.889 52.148-12.516 381.933-600.064z", + "M772.741-2.37h-521.481c-138.202 0-251.259 113.057-251.259 251.259v521.481c0 138.183 113.057 251.259 251.259 251.259h521.481c138.183 0 251.259-113.076 251.259-251.259v-521.481c0-138.202-113.076-251.259-251.259-251.259zM99.366 811.179c-26.169 0-47.332-21.447-47.332-47.919 0-26.624 21.163-48.223 47.332-48.223 26.055 0 47.369 21.599 47.369 48.223-0.019 26.472-21.314 47.919-47.369 47.919zM99.366 557.549c-26.169 0-47.332-21.447-47.332-47.938 0-26.605 21.163-48.223 47.332-48.223 26.055 0 47.369 21.618 47.369 48.223-0.019 26.491-21.314 47.938-47.369 47.938zM99.366 303.919c-26.169 0-47.332-21.428-47.332-47.938 0-26.605 21.163-48.223 47.332-48.223 26.055 0 47.369 21.618 47.369 48.223-0.019 26.51-21.314 47.938-47.369 47.938zM955.259 735.365c0 119.637-97.887 217.524-217.524 219.895l-543.365-1.745v-886.689l543.365-0.455c119.637 0 217.524 97.887 217.524 217.524v451.47z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "documentation" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 11, + "id": 8, + "prevSize": 24, + "code": 58890, + "name": "documentation", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 8 + }, + { + "icon": { + "paths": [ + "M512.986 682.989c57.647 0 104.277-46.592 104.277-104.183 0-57.496-46.63-104.145-104.277-104.145-57.458 0-104.164 46.649-104.164 104.145 0.019 57.591 46.706 104.183 104.164 104.183", + "M763.733 711.32c45.378 0 82.072-36.674 82.072-81.996 0-45.265-36.712-81.958-82.072-81.958-45.189 0-81.996 36.712-81.996 81.958 0 45.321 36.826 81.996 81.996 81.996", + "M785.749 748.791c-39.045 0-73.519 17.863-95.004 45.303 7.851 16.839 12.231 35.423 12.231 54.955v110.042h200.666v-99.556c-0.019-61.156-52.717-110.744-117.893-110.744", + "M260.305 711.32c45.189 0 81.996-36.674 81.996-81.996 0-45.265-36.807-81.958-81.996-81.958-45.359 0-82.091 36.712-82.091 81.958-0 45.321 36.731 81.996 82.091 81.996", + "M238.308 748.791c-65.195 0-117.893 49.569-117.893 110.744v99.556h200.666v-110.042c0-19.532 4.38-38.135 12.212-54.955-21.466-27.42-55.96-45.303-94.985-45.303", + "M512.986 714.562c-84.689 0-153.259 64.417-153.259 143.91v162.437h306.498v-162.437c0-79.493-68.494-143.91-153.24-143.91", + "M891.847 129.119c0-70.068-169.491-126.919-379.051-126.919-208.896-0-378.728 56.851-378.728 126.919 0 44.108 67.167 82.906 168.903 105.662l-16.801 173.018 96.332-159.611c25.429 3.129 52.072 5.385 79.72 6.637l49.247 193.858 49.19-193.726c28.729-1.214 56.358-3.527 82.697-6.751l96.332 159.592-16.801-172.999c101.888-22.737 168.96-61.554 168.96-105.681z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "community" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 12, + "id": 9, + "prevSize": 24, + "code": 58891, + "name": "community", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 9 + }, + { + "icon": { + "paths": [ + "M772.741-0.019h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM316.151 402.015l-124.947 108.241 124.947 108.241v112.242l-254.521-220.482 254.521-220.482v112.242zM461.577 825.135l-76.383-0.265 170.591-630.803 77.103-0.91-171.311 631.979zM699.164 725.94v-112.242l119.41-103.443-119.41-103.443v-112.242l248.984 215.685-248.984 215.685z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "code" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 13, + "id": 10, + "prevSize": 24, + "code": 58892, + "name": "code", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 10 + }, + { + "icon": { + "paths": [ + "M770.37-2.37h-521.481c-138.183 0-251.259 113.076-251.259 251.259v521.481c0 138.183 113.076 251.259 251.259 251.259h521.481c138.221 0 251.259-113.076 251.259-251.259v-521.481c0-138.183-113.038-251.259-251.259-251.259zM825.742 670.758l-155.117 155.098-160.18-160.18-160.199 160.218-155.136-155.136 160.199-160.218-160.199-160.218 155.136-155.098 160.18 160.199 160.18-160.199 155.117 155.098-160.18 160.218 160.199 160.218z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "close" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 14, + "id": 11, + "prevSize": 24, + "code": 88, + "name": "close", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 11 + }, + { + "icon": { + "paths": [ + "M772.741-2.37h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.183 113.057 251.259 251.259 251.259h521.481c138.183 0 251.259-113.076 251.259-251.259v-521.481c0-138.183-113.076-251.259-251.259-251.259zM765.63 82.849c26.586 0 48.223 21.144 48.223 47.332 0 26.036-21.637 47.351-48.223 47.351-26.472 0-47.919-21.314-47.919-47.351 0-26.188 21.447-47.332 47.919-47.332zM512 82.849c26.586 0 48.223 21.144 48.223 47.332 0 26.036-21.637 47.351-48.223 47.351-26.491 0-47.919-21.314-47.919-47.351 0-26.188 21.428-47.332 47.919-47.332zM258.37 82.849c26.605 0 48.223 21.144 48.223 47.332 0 26.036-21.618 47.351-48.223 47.351-26.491 0-47.919-21.314-47.919-47.351 0-26.188 21.428-47.332 47.919-47.332zM732.843 953.666h-451.47c-119.637 0-217.524-97.887-219.895-217.524l1.745-479.365h886.689l0.455 479.365c0 119.637-97.887 217.524-217.524 217.524z", + "M533.561 320.796h150.528v146.963h-150.528v-146.963z", + "M737.583 320.796h150.528v146.963h-150.528v-146.963z", + "M125.44 534.111h150.528v146.963h-150.528v-146.963z", + "M329.5 534.111h150.528v146.963h-150.528v-146.963z", + "M533.561 534.111h150.528v146.963h-150.528v-146.963z", + "M737.583 534.111h150.528v146.963h-150.528v-146.963z", + "M275.968 894.407v-146.963h-150.528c0 82.887 83.209 146.963 150.528 146.963z", + "M329.5 747.444h150.528v146.963h-150.528v-146.963z", + "M533.561 747.444h150.528v146.963h-150.528v-146.963z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "calendar" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 15, + "id": 12, + "prevSize": 24, + "code": 58894, + "name": "calendar", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 12 + }, + { + "icon": { + "paths": [ + "M508.207 66.882c-244.452 0-442.615 198.163-442.615 442.615 0 244.452 198.163 442.615 442.615 442.615 244.471 0 442.615-198.163 442.615-442.615-0-244.452-198.201-442.615-442.615-442.615zM164.485 424.467l-22.414-22.414c22.225-75.928 67.508-141.862 127.526-190.18l34.266 127.829c-53.134 17.010-100.712 46.364-139.378 84.764zM409.335 764.188c-52.679 0-95.384-42.705-95.384-95.403 0-9.956 1.972-19.38 4.798-28.425l-111.426-172.677 174.364 110.327c8.799-2.693 17.958-4.551 27.648-4.551 52.66 0 95.346 42.705 95.346 95.327 0 52.698-42.686 95.403-95.346 95.403zM409.335 323.205c-23.571 0-46.554 2.408-68.779 6.884l-38.116-142.241c59.335-38.153 129.934-60.283 205.767-60.283 35.992 0 70.751 5.139 103.765 14.45l-83.778 202.278c-37.111-13.502-77.065-21.087-118.86-21.087zM731.932 540.52c-32.18-79.189-92.615-143.834-168.77-181.476l84.897-204.971c131.641 51.883 227.48 174.839 240.375 321.612l-156.501 64.834z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "beginner" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 16, + "id": 13, + "prevSize": 24, + "code": 58895, + "name": "beginner", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 13 + }, + { + "icon": { + "paths": [ + "M508.207 66.882c-244.452 0-442.615 198.163-442.615 442.615 0 244.452 198.163 442.615 442.615 442.615 244.471 0 442.615-198.163 442.615-442.615-0-244.452-198.201-442.615-442.615-442.615zM508.207 127.583c35.992 0 70.751 5.139 103.765 14.45l-83.778 202.278c-37.092-13.521-77.047-21.087-118.86-21.087-23.571 0-46.554 2.408-68.779 6.884l-38.116-142.241c59.335-38.153 129.934-60.283 205.767-60.283zM164.485 424.467l-22.414-22.414c22.225-75.928 67.508-141.862 127.526-190.18l34.266 127.829c-53.134 17.010-100.712 46.364-139.378 84.764zM502.253 647.964c1.498 6.713 2.427 13.653 2.427 20.821 0 52.698-42.686 95.403-95.346 95.403-52.679 0-95.384-42.705-95.384-95.403 0-52.622 42.705-95.327 95.384-95.327 12.459 0 24.292 2.56 35.195 6.884l169.851-109.625-112.128 177.247zM731.932 540.52c-32.18-79.189-92.615-143.834-168.77-181.476l84.897-204.971c131.641 51.883 227.48 174.839 240.375 321.612l-156.501 64.834z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "advanced" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 17, + "id": 14, + "prevSize": 24, + "code": 58896, + "name": "advanced", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 14 + }, + { + "icon": { + "paths": [ + "M772.741-2.37h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM197.215 189.212h279.078v-61.231h71.149v61.231h286.189v194.75h-286.189v61.668h-71.149v-61.687h-279.078l-103.329-96.18 103.329-98.551zM824.149 701.175h-276.708v255.64h-71.149v-255.64h-281.448v-193.517h629.305l103.367 97.337-103.367 96.18z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "sitemap" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 18, + "id": 15, + "prevSize": 24, + "code": 58897, + "name": "sitemap", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 15 + }, + { + "icon": { + "paths": [ + "M190.843 190.445c-78.431 78.507-78.431 205.577-0.038 284.027 78.412 78.374 205.596 78.412 284.008-0.019s78.412-205.559-0.038-283.951c-78.374-78.431-205.521-78.431-283.932-0.057zM442.216 358.343c-0.095-75.34-60.966-136.211-136.23-136.306v-26.795c90.055 0 163.025 73.045 163.1 163.119h-26.871zM770.37-0.019h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM944.242 838.447l-104.695 104.676c-15.663 15.701-41.169 15.663-56.87-0.019l-253.421-253.421c-15.701-15.72-15.701-41.188 0-56.908l27.781-27.781-61.857-61.876c-104.448 80.668-254.843 73.311-350.587-22.433-103.993-103.974-103.993-272.517 0-376.491 103.955-103.936 272.517-103.936 376.491 0.019 95.441 95.46 103.007 245.286 23.078 349.677l61.971 61.952 27.8-27.8c15.72-15.663 41.207-15.644 56.908 0l253.402 253.44c15.72 15.758 15.739 41.244 0 56.965z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "search" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 19, + "id": 16, + "prevSize": 24, + "code": 58898, + "name": "search", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 16 + }, + { + "icon": { + "paths": [ + "M190.843 190.445c-78.431 78.507-78.431 205.577-0.038 284.027 78.412 78.374 205.596 78.412 284.008-0.019s78.412-205.559-0.038-283.951c-78.374-78.431-205.521-78.431-283.932-0.057zM442.216 358.343c-0.095-75.34-60.966-136.211-136.23-136.306v-26.795c90.055 0 163.025 73.045 163.1 163.119h-26.871zM944.242 838.447l-104.695 104.676c-15.663 15.701-41.169 15.663-56.87-0.019l-253.421-253.421c-15.701-15.72-15.701-41.188 0-56.908l27.781-27.781-61.857-61.876c-104.448 80.668-254.843 73.311-350.587-22.433-103.993-103.974-103.993-272.517 0-376.491 103.955-103.936 272.517-103.936 376.491 0.019 95.441 95.46 103.007 245.286 23.078 349.677l61.971 61.952 27.8-27.8c15.72-15.663 41.207-15.644 56.908 0l253.402 253.44c15.72 15.758 15.739 41.244 0 56.965z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "search-alt" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 20, + "id": 17, + "prevSize": 24, + "code": 58899, + "name": "search-alt", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 17 + }, + { + "icon": { + "paths": [ + "M607.991 863.573c20.309 0 36.788-16.744 36.788-37.509 0-20.632-16.479-37.262-36.788-37.262-20.29 0-36.807 16.631-36.807 37.262 0 20.764 16.517 37.509 36.807 37.509zM418.475 151.249c-20.328 0-36.826 16.858-36.826 37.528 0 20.613 16.498 37.3 36.826 37.3 20.309 0 36.864-16.687 36.845-37.3-0-20.67-16.555-37.528-36.845-37.528zM772.741-2.37h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.038 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM285.279 609.735v89.714h-67.47c-57.079 0-90.377-41.434-104.334-99.556-18.849-78.014-18.053-124.719 0-199.509 15.607-65.195 65.593-99.537 122.652-99.537h269.995v-24.917h-196.343v-74.847c0-56.623 15.113-87.305 98.152-101.983 28.179-5.025 60.245-7.87 93.81-8.021 33.583-0.171 68.57 2.389 102.305 8.021 53.267 8.856 98.152 48.83 98.152 101.964v186.956c0 54.803-43.596 99.802-98.152 99.802h-196.134c-66.541 0.019-122.633 57.135-122.633 121.913zM912.991 614.438c-19.816 59.733-41.112 99.556-98.152 99.556h-294.21v24.879h196.077v74.828c0 56.642-48.735 85.466-98.152 99.783-74.373 21.542-133.973 18.242-196.115 0-51.902-15.284-98.133-46.573-98.133-99.783v-186.899c0-53.779 44.411-99.764 98.133-99.764h196.096c65.308 0 122.633-56.832 122.633-124.492v-87.173h73.69c57.116 0 84.044 42.761 98.152 99.518 19.627 78.943 20.48 138.069-0.019 199.547z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "python" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 21, + "id": 18, + "prevSize": 24, + "code": 58900, + "name": "python", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 18 + }, + { + "icon": { + "paths": [ + "M653.672 373.077c-32.521 0-58.861 26.908-58.861 59.98 0 32.977 26.34 59.62 58.861 59.62 32.446 0 58.899-26.624 58.899-59.62 0-33.071-26.453-59.98-58.899-59.98zM393.216 373.077c-32.54 0-58.88 26.908-58.88 59.98 0 32.977 26.34 59.62 58.88 59.62 32.351 0 58.88-26.624 58.88-59.62 0-33.071-26.529-59.98-58.88-59.98zM772.741-0.019h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM853.807 399.474c0 32.275-4.248 60.568-12.117 85.694l-2.882 9.14c-1.517 4.21-3.413 8.533-5.367 12.933l-4.229 9.083c-33.849 67.413-101.812 105.472-198.58 120.396l-11.719 1.801 7.927 8.761c19.361 21.39 28.843 43.653 30.303 67.47v171.672c0.057 13.502 5.404 24.614 13.672 33.887-34.854-2.313-58.785-15.227-58.823-37.054v-143.019c0-18.773-17.73-20.518-20.006-20.518-0.796 0-1.441 0.114-1.877 0.209l-4.798 1.176v5.006c0 0 0 153.6 0 169.586-0.19 11.928 2.465 22.509 9.178 31.801-38.381-1.877-53.267-19.589-53.855-40.695 0 0.038 0-147.949 0-156.331 0-8.306-7.471-12.667-13.047-12.667-5.784 0-13.16 4.399-13.16 12.667-0.038 8.268-0.038 164.087-0.038 164.087-0.74 23.097-24.102 31.801-56.548 32.787 5.158-7.301 9.254-16.194 9.235-28.065v-180.053l-6.808 0.531c-0.171 0-19.001 1.365-19.589 20.461v146.792c-0.057 18.318-21.011 36.75-54.405 38.4 6.428-8.078 10.335-18.375 10.202-30.663v-119.182h-57.742c-107.179 1.138-101.224-97.261-162.854-146.66 56.737 6.713 80.801 85.845 155.003 87.685 45.359 0 56.623 0 56.623 0h5.575l0.702-5.537c3.3-25.335 15.55-47.388 39.367-66.807l11.681-9.576-14.905-1.669c-105.946-12.629-176.981-51.655-213.883-117.153l-5.082-9.121c-1.953-3.906-3.812-8.363-5.727-13.028l-3.565-9.14c-9.633-26.624-14.943-57.135-15.436-91.61-0.019-1.46-0.019-2.788-0.019-4.172 0.057-58.482 16.194-110.345 56.908-153.562l2.446-2.655-0.891-3.356c-5.348-20.196-7.813-40.505-7.889-60.928 0.038-24.804 3.812-49.778 10.923-75.055 46.364 2.958 93.544 19.342 141.919 52.034l2.219 1.46 2.655-0.569c39.633-8.647 79.379-12.705 119.068-12.705 41.036 0 82.072 4.38 123.089 12.705l2.731 0.512 2.257-1.555c41.358-29.374 87.381-46.611 138.847-51.712 8.495 28.786 13.464 57.534 13.464 86.13 0 12.971-0.967 25.96-3.148 38.969l-0.436 2.788 1.82 2.238c37.395 46.156 60.928 101.205 61.705 172.544-0.133 1.081-0.095 2.276-0.095 3.413z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "github" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 22, + "id": 19, + "prevSize": 24, + "code": 58901, + "name": "github", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 19 + }, + { + "icon": { + "paths": [ + "M511.924 578.37c33.489 0 60.7-24.367 60.7-63.147v-445.8c0-38.836-27.231-63.109-60.7-63.109-33.527 0-60.681 24.273-60.681 63.109v445.8c0 38.779 27.174 63.147 60.681 63.147zM703.924 104.107v146.015c95.554 62.407 158.853 169.965 158.853 292.599 0 193.214-156.691 349.886-349.98 349.886-193.308 0-350.018-156.672-350.018-349.886 0-122.292 62.957-229.623 158.056-292.124v-146.053c-168.77 74.012-286.853 242.157-286.853 438.272 0 264.439 214.376 478.815 478.815 478.815 264.42 0 478.796-214.376 478.796-478.815 0-196.418-118.424-364.904-287.668-438.708z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "get-started" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 23, + "id": 20, + "prevSize": 24, + "code": 58902, + "name": "get-started", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 20 + }, + { + "icon": { + "paths": [ + "M770.37 0h-521.481c-138.202 0-251.259 113.057-251.259 251.259v521.481c0 138.183 113.057 251.259 251.259 251.259h521.481c138.183 0 251.259-113.076 251.259-251.259v-521.481c0-138.202-113.076-251.259-251.259-251.259zM299.255 842.183c-65.043 0-117.76-52.698-117.76-117.741s52.717-117.741 117.76-117.741c65.005 0 117.722 52.698 117.722 117.741s-52.736 117.741-117.722 117.741zM611.745 827.923h-145.351c18.679-30.113 29.62-65.479 29.62-103.481 0-108.658-88.102-196.817-196.76-196.817-39.993 0-77.084 12.004-108.146 32.484v-146.508c33.906-11.795 70.182-18.565 108.146-18.66 181.931 0.322 329.14 147.551 329.463 329.481-0.095 36.162-6.163 70.903-16.972 103.5zM843.036 827.923h-149.030c8.666-33.109 13.786-67.698 13.786-103.519-0.057-225.64-182.936-408.5-408.519-408.519-37.528 0-73.633 5.48-108.146 14.943v-149.352c34.987-6.903 71.111-10.638 108.146-10.638 305.759 0 553.567 247.865 553.567 553.567-0.019 35.366-3.508 69.973-9.804 103.519z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "feed" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 24, + "id": 21, + "prevSize": 24, + "code": 58903, + "name": "feed", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 21 + }, + { + "icon": { + "paths": [ + "M772.741-2.37h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM677.812 507.563h-105.453v381.952h-157.999v-381.952h-79v-131.622h79v-79.038c0-107.368 44.601-171.255 171.179-171.255h105.472v131.641h-65.896c-49.323 0-52.584 18.413-52.584 52.717l-0.19 65.934h119.448l-13.976 131.622z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "facebook" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 25, + "id": 22, + "prevSize": 24, + "code": 58904, + "name": "facebook", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 22 + }, + { + "icon": { + "paths": [ + "M896 188.056h-772.741c-69.101 0-125.63 56.529-125.63 125.63v5.177l509.63 253.193 514.37-255.545v-2.825c0-69.101-56.529-125.63-125.63-125.63zM1021.63 635.032v-252.169l-253.175 125.781 253.175 126.388zM-2.37 385.233v248.225l249.211-124.416-249.211-123.809zM507.259 638.426l-192.341-95.554-317.269 157.582c0.209 68.93 56.642 125.231 125.611 125.231h772.741c68.437 0 124.492-55.505 125.535-123.714l-321.138-159.497-193.138 95.953z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "email" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 26, + "id": 23, + "prevSize": 24, + "code": 58905, + "name": "email", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 23 + }, + { + "icon": { + "paths": [ + "M770.37-2.37h-521.481c-138.183 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.076 251.259 251.259 251.259h521.481c138.202 0 251.278-113.057 251.278-251.259v-521.481c0-138.183-113.076-251.259-251.278-251.259zM705.252 507.885v320.057h-382.066v-320.057h-190.255l380.094-382.824 383.166 382.824h-190.938z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "arrow-up" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 27, + "id": 24, + "prevSize": 24, + "code": 58906, + "name": "arrow-up", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 24 + }, + { + "icon": { + "paths": [ + "M770.37-2.37h-521.481c-138.221 0-251.259 113.076-251.259 251.259v521.481c0 138.183 113.038 251.259 251.259 251.259h521.481c138.183 0 251.259-113.076 251.259-251.259v-521.481c0-138.183-113.076-251.259-251.259-251.259zM511.374 896.19v-190.938h-320.076v-382.066h320.076v-190.255l382.824 380.075-382.824 383.185z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "arrow-right" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 28, + "id": 25, + "prevSize": 24, + "code": 58907, + "name": "arrow-right", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 25 + }, + { + "icon": { + "paths": [ + "M770.37-2.389h-521.481c-138.183 0-251.259 113.076-251.259 251.278v521.481c0 138.183 113.076 251.259 251.259 251.259h521.481c138.221 0 251.259-113.076 251.259-251.259v-521.481c0-138.202-113.038-251.278-251.259-251.278zM827.961 696.073h-320.076v190.255l-382.824-380.094 382.824-383.166v190.919h320.076v382.085z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "arrow-left" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 29, + "id": 26, + "prevSize": 24, + "code": 58908, + "name": "arrow-left", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 26 + }, + { + "icon": { + "paths": [ + "M770.389-2.37h-521.481c-138.202 0-251.278 113.038-251.278 251.259v521.481c0 138.183 113.076 251.259 251.278 251.259h521.481c138.183 0 251.259-113.076 251.259-251.259v-521.481c0-138.221-113.076-251.259-251.259-251.259zM506.254 894.18l-383.166-382.805h190.9v-320.076h382.085v320.076h190.255l-380.075 382.805z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "arrow-down" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 30, + "id": 27, + "prevSize": 24, + "code": 58909, + "name": "arrow-down", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 27 + }, + { + "icon": { + "paths": [ + "M772.741-2.37h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.038 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM309.627 826.273c-99.859 0-180.812-80.953-180.812-180.793 0-99.821 80.953-180.774 180.812-180.774 27.364 0 53.267 6.277 76.535 17.18l-54.689 94.701c-6.884-2.238-14.241-3.451-21.845-3.451-39.936 0-72.325 32.37-72.325 72.306s32.389 72.344 72.325 72.344c35.537 0 65.062-25.714 71.111-59.506h109.037c-6.618 93.848-84.632 167.993-180.148 167.993zM438.234 306.593c0 19.456 7.737 37.035 20.215 50.081l-55.068 95.308c-44.563-32.92-73.652-85.694-73.652-145.389 0-99.821 80.953-180.774 180.812-180.774 99.84 0 180.774 80.934 180.774 180.774 0 59.582-28.937 112.318-73.406 145.237l-55.049-95.384c12.364-13.009 20.044-30.492 20.044-49.854 0-39.936-32.446-72.325-72.344-72.325-39.936 0-72.325 32.389-72.325 72.325zM708.475 826.216c-95.554 0-173.549-74.145-180.148-167.955h109.037c6.030 33.83 35.556 59.525 71.111 59.525 39.898 0 72.287-32.37 72.287-72.325 0-39.917-32.37-72.287-72.287-72.287-6.599 0-12.99 0.967-19.039 2.636l-54.917-95.175c22.585-10.145 47.597-15.948 73.956-15.948 99.859 0 180.774 80.934 180.774 180.755s-80.915 180.774-180.774 180.774z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "freenode" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 31, + "id": 28, + "prevSize": 24, + "code": 58910, + "name": "freenode", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 28 + }, + { + "icon": { + "paths": [ + "M990.701 763.98l-336.175-688.014c-58.69-104.41-224.616-92.558-269.483-1.214l-345.353 690.479c-74.828 142.279-0.929 258.769 164.162 258.769h620.165c165.073 0 240.090-117.020 166.684-260.020zM607.744 891.259h-185.401v-189.573h185.401v189.573zM610.057 384l-33.716 253.080h-122.728l-33.185-253.080v-192h189.63v192z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "alert" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 32, + "id": 29, + "prevSize": 24, + "code": 58911, + "name": "alert", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 29 + }, + { + "icon": { + "paths": [ + "M61.554 313.685l450.37-187.259 445.63 187.259-445.63 189.63z", + "M511.924 569.666l-297.415-125.212-152.955 63.602 450.37 189.611 445.63-189.611-151.343-63.602z", + "M511.924 761.666l-297.415-125.231-152.955 63.602 450.37 189.63 445.63-189.63-151.343-63.602z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "versions" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 33, + "id": 30, + "prevSize": 24, + "code": 58912, + "name": "versions", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 30 + }, + { + "icon": { + "paths": [ + "M688.583 286.227c-24.728 0-44.715 20.461-44.715 45.587 0 25.012 19.987 45.246 44.715 45.246 24.595 0 44.753-20.252 44.734-45.246 0.019-25.126-20.139-45.587-44.734-45.587zM772.741-2.37h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM816.488 392.021c10.449 231.519-162.588 475.136-468.158 475.136-92.956 0-179.428-27.269-252.302-73.937 87.324 10.278 174.497-13.995 243.674-68.134-72.002-1.365-132.836-48.962-153.771-114.328 25.79 4.93 51.181 3.489 74.354-2.769-79.132-15.929-133.803-87.268-132.001-163.499 22.168 12.288 47.597 19.759 74.562 20.556-73.311-48.962-94.094-145.768-50.972-219.705 81.18 99.537 202.505 165.092 339.285 171.918-24.064-102.912 54.101-202.107 160.275-202.107 47.369 0 90.112 20.025 120.187 52.034 37.509-7.396 112.924-60.833 144.706-79.682-12.288 38.438-78.26 119.353-112.299 139.7 33.375-3.944 92.786 5.613 122.292-7.509-22.092 33.015-77.596 49.133-109.833 72.325z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "twitter" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 34, + "id": 31, + "prevSize": 24, + "code": 58913, + "name": "twitter", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 31 + }, + { + "icon": { + "paths": [ + "M770.37-0.019h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM382.028 837.385c-11.169 5.329-34.076 3.375-54.537 3.375h-114.65c-35.631 0-68.191 1.517-75.7-23.381-6.106-20.271-1.119-64.645-1.119-89.050v-180.319c0-42.856-9.273-100.58 23.362-110.213 11.548-3.432 31.744-1.1 46.763-1.1h47.863c44.297 0 91.913-7.111 109.682 15.113l34.114 364.961c-2.484 8.875-7.377 16.631-15.777 20.613zM857.335 628.11c34.816 21.656 18.413 91.231-14.488 102.419 19.475 16.194 13.103 52.527 0 67.906-45.796 53.779-181.305 37.831-284.937 37.831-23.438 0-48.109 2.788-64.55 0-15.246-2.617-26.662-11.264-38.381-19.589l-35.252-377.268c6.163-10.714 11.89-21.751 14.658-26.131 21.883-34.683 44.582-68.248 73.444-93.506 14.829-12.971 32.635-20.271 51.219-32.275 23.324-15.095 56.699-58.615 60.113-93.487 1.384-14.526-2.882-39.481 3.319-52.357 5.803-11.947 29.715-27.572 50.119-21.125 23.59 7.452 42.174 45.435 44.544 75.719 2.332 30.549-3.11 62.995-15.607 83.437-13.464 22.035-28.236 30.587-36.731 47.863-7.49 15.208-9.956 28.046-12.25 52.319 79.929 4.855 201.216-13.388 233.775 41.188 17.446 29.26-6.22 85.257-30.075 96.825 43.899 14.715 42.344 93.62 1.081 110.232zM258.181 686.478c-26.188 0-47.332 21.618-47.332 48.223 0 26.491 21.144 47.919 47.332 47.919 26.036 0 47.351-21.428 47.351-47.919-0-26.605-21.314-48.223-47.351-48.223z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "thumbs-up" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 35, + "id": 32, + "prevSize": 24, + "code": 58914, + "name": "thumbs-up", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 32 + }, + { + "icon": { + "paths": [ + "M248.889 1024h521.481c138.202 0 251.259-113.076 251.259-251.259v-521.481c0-138.202-113.057-251.278-251.259-251.278h-521.481c-138.183 0-251.259 113.076-251.259 251.278v521.481c0 138.183 113.076 251.259 251.259 251.259zM637.231 186.596c11.169-5.329 34.076-3.375 54.537-3.375h114.65c35.631 0 68.191-1.517 75.7 23.381 6.106 20.271 1.119 64.645 1.119 89.050v180.319c0 42.856 9.254 100.58-23.362 110.213-11.548 3.432-31.744 1.1-46.763 1.1h-47.863c-44.297 0-91.932 7.092-109.682-15.113l-34.114-364.961c2.484-8.875 7.358-16.631 15.777-20.613zM161.925 395.871c-34.816-21.656-18.413-91.231 14.488-102.419-19.475-16.194-13.103-52.527 0-67.906 45.796-53.779 181.305-37.831 284.937-37.831 23.438 0 48.109-2.788 64.55 0 15.246 2.617 26.643 11.264 38.381 19.589l35.252 377.268c-6.163 10.714-11.89 21.751-14.658 26.131-21.883 34.683-44.582 68.248-73.444 93.506-14.829 12.971-32.635 20.271-51.219 32.275-23.324 15.095-56.699 58.615-60.113 93.487-1.384 14.526 2.882 39.481-3.319 52.357-5.803 11.947-29.715 27.572-50.119 21.125-23.59-7.452-42.174-45.435-44.544-75.719-2.332-30.549 3.11-62.995 15.607-83.437 13.464-22.035 28.236-30.587 36.731-47.863 7.49-15.208 9.956-28.046 12.25-52.319-79.929-4.855-201.216 13.388-233.775-41.188-17.446-29.26 6.22-85.257 30.075-96.825-43.899-14.715-42.344-93.62-1.081-110.232zM761.079 512.815c26.188 0 47.332-21.618 47.332-48.223 0-26.491-21.144-47.919-47.332-47.919-26.036 0-47.351 21.428-47.351 47.919 0 26.605 21.314 48.223 47.351 48.223z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "thumbs-down" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 36, + "id": 33, + "prevSize": 24, + "code": 58915, + "name": "thumbs-down", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 33 + }, + { + "icon": { + "paths": [ + "M630.139 539.212h124.511l-61.668-234.837-62.843 234.837zM231.993 596.082h64.076l-31.611-147.399-32.465 147.399zM772.741-0.019h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM344.955 763.354l-27.989-95.782h-106.97l-29.639 95.782h-88.235l135.604-422.798h72.306l131.736 422.798h-86.812zM820.452 764.321l-37.66-128.872h-182.234l-39.898 128.872h-99.631l182.5-568.984h97.318l177.304 568.984h-97.697z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "text-resize" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 37, + "id": 34, + "prevSize": 24, + "code": 58916, + "name": "text-resize", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 34 + }, + { + "icon": { + "paths": [ + "M593.427 476.824l128.91-93.867h-152.292l-58.482-140.383-46.895 140.383h-152.102l128.74 93.867-58.615 163.859 128.872-105.396 128.683 105.396-46.82-163.859zM479.327 865.754c-12.535-1.271-24.86-3.167-36.997-5.613 7.073-44.146-1.764-89.695-16.498-124.511-15.607-35.157-33.849-51.333-57.192-54.177-18.489 38.153-29.582 81.408-16.308 120.282 5.158 16.137 14.45 29.449 26.207 39.671-41.719-16.194-79.796-39.519-113.076-68.267 22.812-30.208 36.978-67.186 41.908-100.902 4.741-36.807-2.2-61.402-19.191-78.412-30.417 20.992-57.116 51.086-64.455 90.491-3.527 17.048-2.503 33.773 1.801 49.019-22.206-25.638-41.131-54.101-56.092-84.935 28.236-13.843 51.731-39.177 66.238-67.584 14.791-30.398 16.251-57.742 7.945-83.437-29.961 2.996-59.62 17.105-77.122 48.811-10.638 18.413-14.962 40.183-13.824 61.478-14.127-40.258-22.168-83.399-22.168-128.493 0-6.618 0.531-13.103 0.853-19.646 25.998 3.508 52.698-5.803 74.183-24.026 22.528-20.063 34.456-46.061 39.31-75.34-23.192-13.179-50.991-15.455-76.724 4.134-12.25 8.913-22.225 21.921-29.544 36.978 8.325-40.865 22.831-79.493 42.894-114.593 18.148 16.005 42.837 20.499 69.044 13.767 28.027-7.851 52.11-26.719 74.088-50.574-11.093-21.732-33.052-36.257-64.645-30.91-16.194 2.295-32.465 9.956-47.028 21.371 24.595-31.479 53.893-58.994 86.907-81.617 9.69 17.92 30.644 27.553 60.226 27.667 31.953-0.474 68.191-11.074 107.501-24.595-0.076-19.646-17.692-36.409-54.632-39.974-17.863-2.105-37.755-0.171-57.325 5.101 26.889-12.497 55.315-22.281 85.125-28.388 8.875-1.839 14.583-10.468 12.781-19.342-1.839-8.875-10.468-14.583-19.342-12.781-24.595 5.044-48.375 12.269-71.206 21.39 9.406-6.751 18.508-13.634 26.984-20.651 30.758-24.538 45.189-46.459 35.821-64.512-55.334 7.433-104.638 31.004-130.522 60.738-22.964 27.288-24.102 51.693-13.786 68.267-30.929 21.182-58.918 46.251-83.153 74.695 5.385-11.7 10.297-23.514 13.995-35.518 11.34-35.233 10.031-64-6.903-81.56-39.045 24.424-68.551 64.417-76.079 103.424-6.542 36.466 5.329 62.445 24.329 76.667-20.385 35.404-35.385 74.202-44.809 115.124-1.517-14.962-3.982-29.772-8.344-44.070-10.543-35.631-29.355-60.113-55.031-66.844-19.608 41.169-24.311 91.212-10.012 128.133 13.426 33.849 37.945 49 63.431 50.953-0.55 8.799-1.176 17.598-1.176 26.529 0 40.638 5.803 79.91 16.536 117.077-7.396-9.766-15.436-19.058-25.012-27.117-27.117-23.381-58.311-32.939-87.704-23.040-0.076 47.18 17.958 93.431 48.981 115.845 29.62 20.992 62.123 16.915 89.41 0.607 21.713 44.772 51.124 85.011 86.509 119.239-20.366-15.986-44.525-26.377-72.761-29.696-37.092-4.722-73.652 5.215-101.205 31.991 17.427 43.71 54.367 75.985 95.706 77.748 42.060 1.422 76.023-26.169 97.811-61.762-1.062-1.176-2.2-2.219-3.3-3.356 44.734 38.969 97.564 68.93 155.913 86.319-25.998 1.062-51.75 7.964-77.483 21.732-38.628 20.442-69.006 53.039-81.806 94.265 40.031 26.377 95.516 30.53 138.505 5.139 41.434-24.841 59.525-68.077 61.497-111.332 12.079 2.332 24.311 4.248 36.75 5.499 0.55 0.057 1.1 0.076 1.65 0.076 8.306 0 15.436-6.258 16.289-14.715 0.872-8.988-5.689-17.048-14.677-17.939zM934.817 569.154c-9.595 8.078-17.673 17.37-25.050 27.174 10.752-37.186 16.536-76.478 16.555-117.134 0-8.951-0.626-17.749-1.176-26.548 25.505-1.953 50.024-17.086 63.469-50.953 14.298-36.921 9.595-86.945-10.012-128.133-25.676 6.732-44.506 31.213-55.031 66.844-4.38 14.317-6.827 29.165-8.306 44.127-9.425-40.96-24.443-79.777-44.828-115.2 19.001-14.222 30.891-40.201 24.348-76.686-7.509-39.007-37.035-79-76.079-103.424-16.953 17.56-18.242 46.327-6.903 81.56 3.679 12.023 8.609 23.874 14.014 35.593-24.235-28.482-52.243-53.589-83.191-74.771 10.335-16.574 9.178-40.979-13.786-68.267-25.884-29.734-75.188-53.305-130.522-60.738-9.368 18.053 5.063 39.974 35.821 64.512 8.495 7.035 17.636 13.919 27.060 20.708-22.869-9.121-46.668-16.384-71.301-21.409-8.875-1.839-17.541 3.906-19.361 12.781-1.801 8.837 3.925 17.503 12.8 19.323 29.81 6.106 58.216 15.872 85.125 28.388-19.57-5.272-39.462-7.187-57.325-5.101-36.94 3.565-54.556 20.328-54.632 39.974 39.31 13.502 75.548 24.102 107.501 24.595 29.582-0.114 50.536-9.747 60.226-27.667 32.958 22.604 62.236 50.1 86.831 81.541-14.564-11.378-30.815-19.001-46.971-21.314-31.592-5.329-53.551 9.197-64.645 30.91 21.978 23.874 46.080 42.724 74.088 50.574 26.188 6.732 50.897 2.238 69.025-13.748 20.044 35.081 34.532 73.652 42.856 114.479-7.32-15.019-17.256-27.989-29.487-36.883-25.714-19.589-53.532-17.313-76.724-4.134 4.855 29.279 16.801 55.277 39.31 75.34 21.466 18.204 48.166 27.534 74.145 24.045 0.341 6.542 0.872 13.028 0.872 19.646 0 45.056-8.040 88.14-22.13 128.398 1.119-21.276-3.224-43.027-13.824-61.383-17.522-31.706-47.161-45.815-77.122-48.811-8.306 25.695-6.846 53.058 7.945 83.437 14.507 28.407 37.983 53.741 66.2 67.584-14.943 30.796-33.868 59.24-56.055 84.859 4.305-15.208 5.31-31.934 1.801-48.943-7.358-39.405-34.039-69.499-64.455-90.491-16.991 16.991-23.931 41.586-19.191 78.412 4.93 33.716 19.115 70.694 41.889 100.883-33.28 28.748-71.339 52.053-113.038 68.267 11.757-10.221 21.011-23.514 26.188-39.652 13.255-38.874 2.162-82.129-16.308-120.282-23.324 2.844-41.567 19.039-57.192 54.177-14.715 34.816-23.571 80.365-16.479 124.511-12.174 2.427-24.5 4.343-37.035 5.613-9.026 0.91-15.55 8.951-14.639 17.977 0.872 8.439 8.021 14.734 16.327 14.734 0.531 0 1.1-0.038 1.65-0.095v-0.038c12.421-1.252 24.671-3.167 36.75-5.499 1.972 43.255 20.063 86.49 61.478 111.332 42.989 25.391 98.456 21.22 138.505-5.139-12.819-41.225-43.179-73.823-81.806-94.265-25.733-13.786-51.503-20.689-77.521-21.732 58.425-17.427 111.313-47.407 156.084-86.471-1.157 1.176-2.332 2.276-3.451 3.508 21.788 35.593 55.751 63.185 97.811 61.762 41.339-1.764 78.279-34.039 95.706-77.748-27.553-26.757-64.114-36.712-101.205-31.991-28.274 3.356-52.489 13.748-72.875 29.772 35.404-34.247 64.872-74.505 86.585-119.334 27.288 16.289 59.771 20.404 89.429-0.588 31.023-22.433 49.057-68.665 48.981-115.845-29.412-9.88-60.606-0.322-87.723 23.078z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "success-stories" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 38, + "id": 35, + "prevSize": 24, + "code": 58917, + "name": "success-stories", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 35 + }, + { + "icon": { + "paths": [ + "M124.113 449.574h132.741v385.574h-132.741v-385.574z", + "M250.539 1023.204h521.481c93.127 0 174.668-51.465 218.055-127.241h-957.611c43.387 75.776 124.947 127.241 218.074 127.241z", + "M336.915 196.741h132.741v638.426h-132.741v-638.426z", + "M549.736 323.148h132.741v512h-132.741v-512z", + "M762.539 1.574h132.741v833.574h-132.741v-833.574z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "statistics" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 39, + "id": 36, + "prevSize": 24, + "code": 58918, + "name": "statistics", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 36 + }, + { + "icon": { + "paths": [ + "M772.741-2.37h-521.481c-138.202 0-251.259 113.076-251.259 251.259v521.481c0 138.202 113.057 251.278 251.259 251.278h521.481c138.183 0 251.259-113.076 251.259-251.278v-521.481c0-138.183-113.076-251.259-251.259-251.259zM376.055 250.842l269.065 175.066-36.693 57.989-273.484-168.107 41.112-64.948zM295.291 404.082l307.352 92.748-18.982 65.953-309.627-84.764 21.257-73.937zM260.437 551.064l319.052 35.821-6.789 68.248-319.848-27.553 7.585-76.516zM252.587 680.562h321.024v76.895h-321.024v-76.895zM698.804 890.558h-570.728v-351.118h65.517v290.873h441.799v-290.873h63.412v351.118zM653.047 419.176l-178.745-266.676 64.398-41.927 171.823 271.151-57.477 37.452zM717.577 378.709l-23.742-320.133 76.743-4.665 15.493 320.626-68.494 4.172z" + ], + "attrs": [], + "isMulticolor": false, + "isMulticolor2": false, + "tags": [ + "stack-overflow" + ], + "grid": 0 + }, + "attrs": [], + "properties": { + "order": 40, + "id": 37, + "prevSize": 24, + "code": 58919, + "name": "stack-overflow", + "ligatures": "" + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 37 + }, + { + "icon": { + "paths": [ + "M251.262-2.371c-138.202 0-251.258 113.076-251.258 251.258v521.48c0 138.202 113.058 251.277 251.258 251.277h521.477c138.182 0 251.262-113.076 251.262-251.277v-521.48c0-138.182-113.078-251.258-251.262-251.258h-521.477zM502.934 122h0.969c129.617 0 185.568 7.873 200.336 10.035 87.534 12.798 161.375 78.841 172.773 162.648v0.004c6.202 62.253 0.829 163.576 0.789 180.203 0 4.892-0.717 49.558-1.004 54.273-7.671 119.756-83.16 167.050-162.484 182.117-1.076 0.319-2.331 0.529-3.586 0.777-50.291 9.714-104.166 12.305-155.281 13.723-12.224 0.319-24.41 0.316-36.633 0.316-50.823 0.013-101.466-5.938-150.871-17.727-0.262-0.070-0.537-0.080-0.801-0.020-0.264 0.057-0.513 0.175-0.723 0.344s-0.375 0.385-0.484 0.629c-0.105 0.245-0.155 0.514-0.145 0.781 1.397 15.91 4.892 31.569 10.395 46.582 6.847 17.372 30.757 59.098 119.652 59.098 51.655 0.094 103.141-5.857 153.383-17.727 0.255-0.052 0.517-0.060 0.773 0 0.255 0.057 0.497 0.168 0.703 0.328s0.371 0.362 0.488 0.594c0.112 0.232 0.18 0.487 0.184 0.746v58.777c-0.009 0.277-0.081 0.552-0.211 0.797s-0.314 0.456-0.539 0.621c-16.417 11.77-38.751 18.474-57.785 24.465-8.435 2.623-16.968 4.925-25.594 6.91-78.419 17.666-160.26 13.396-236.363-12.336-71.081-24.675-143.632-85.156-161.555-157.832-9.571-39.35-16.314-79.317-20.18-119.609-5.592-60.658-6.059-121.457-8.461-182.363-1.685-42.471-0.713-88.773 8.355-130.535 18.855-84.799 96.563-144.142 181.66-156.586 14.768-2.163 42.587-10.035 172.238-10.035zM398.371 246.082c-36.885 0-66.6 12.831-89.254 37.824-21.961 25.053-32.941 58.853-32.941 101.395v208.203h83.34v-202.070c0.036-42.542 18.139-64.238 54.379-64.238 40.075 0 60.184 25.665 60.184 76.359v110.609h82.91v-110.609c0-50.695 20.074-76.359 60.148-76.359 36.455 0 54.375 21.696 54.375 64.238v202.070h83.414l0.070-208.203c0-42.566-10.979-76.366-32.941-101.395-22.726-24.993-52.44-37.824-89.289-37.824-42.62 0-74.884 16.237-96.391 48.676l-20.789 34.457-20.754-34.457c-21.507-32.439-53.77-48.676-96.461-48.676z" + ], + "attrs": [ + {} + ], + "isMulticolor": false, + "isMulticolor2": false, + "grid": 0, + "tags": [ + "mastodon" + ] + }, + "attrs": [ + {} + ], + "properties": { + "order": 48, + "id": 38, + "name": "mastodon", + "prevSize": 24, + "code": 59648 + }, + "setIdx": 1, + "setId": 1, + "iconIdx": 38 + } + ], + "height": 1024, + "metadata": { + "name": "Pythonicon" + }, + "preferences": { + "showGlyphs": true, + "showQuickUse": true, + "showQuickUse2": true, + "showSVGs": true, + "fontPref": { + "prefix": "icon-", + "metadata": { + "fontFamily": "Pythonicon", + "majorVersion": 1, + "minorVersion": 0 + }, + "metrics": { + "emSize": 1024, + "baseline": 6.25, + "whitespace": 50 + }, + "embed": false, + "resetPoint": 58880 + }, + "imagePref": { + "prefix": "icon-", + "png": true, + "useClassSelector": true, + "color": 0, + "bgColor": 16777215, + "classSelector": ".icon" + }, + "historySize": 50, + "showCodes": true, + "gridSize": 16 + } +} \ No newline at end of file diff --git a/static/fonts/Pythonicon.svg b/static/fonts/Pythonicon.svg old mode 100755 new mode 100644 index 513b029b5..a7441c98a --- a/static/fonts/Pythonicon.svg +++ b/static/fonts/Pythonicon.svg @@ -3,48 +3,48 @@ Generated by IcoMoon - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/fonts/Pythonicon.ttf b/static/fonts/Pythonicon.ttf old mode 100755 new mode 100644 index 9d69d57a3ef6c89cfb368c4f053508dce434fde2..5c57bd93dec5139cb912d24a5bdc39cff829f1c2 GIT binary patch literal 12452 zcmb_id5{}dneW%9TCJ)C_XfDs?8IL{o#C9BK>|EoCJ$M}AV|@^Z z_zX@Zf24qoAr~nUC<+KU2rO4%*Y=uYAsh=-?Pei_B$eGjmTPy5E0s~tey>{^kAu-9 zRY?81-+g@Fd*Azg-+Kfi2tpuE5fo9}xTUkp?Pa47^N-+m?A$wh;9oC(|0F@6Focio zo;`E`z8(la2w&UoTW^2Yo9$SD2uQ9S|=AH7M{S=*%bEBOJ?qo?%$G z-CjsZUe3m;9#2>hT+|ntR6I62TE04-%?Sea1g@k|ssE``$dAjCB#-9{6_T$Ma03e` z{|RNi`H&P999`awns&K@4j~)ygq=>A<2XSOGGVoAQ!E-&eBr60oRJ7}(O7(nGE6#j ztV{)o(>cAS*VLNIsT6tTewclvKk~81KJpkmAA>jblr{J(lcGLjX0)O6YP(2 zE}Hk+yzsMmdD_KUVNsGqGhF`=!=^?vWwBNh%bC#>%N#y+HRW@>$H8;xJrqMy90gp1 z7ez7@#UQ#FrV&F*>ql4bjD(TjKcXdl$<2k%%}GT|j{5y564^OAy1{r(poO?nxNUUw zwt}3nGlIa_6S5Un;*f~C_4OLV%xs%s7;XL2e&f7TV2ZTrK%>x@(?g%|!7PDHxQz!5}&A?5=FzKJeS(nu*TdgRAqCzd^eyC9j0M#`_z2s7D!^ zp!Yg%#&%Cs#%}H3KGF4Ram@B`P{Ns{;D43J_Y7`dTY9zF@A6QRvllY2?(R9b z*63?y0ZGIyTRUAuH?fYGA~q9S-^MDE%?Yd}lBQ@`g%V0NVg4(o%mLYBPU;9sLo}o& zL~t#a+dUq!TT7)4ds@?KqDUQIcprA6r>1Ec^v85c>lQuri-K`E#? zrKLwlPt^wpQfBR<2(_jLW(SRngNwu}ER=09AD%YlNR;R$28q?gTA;?&reqamwp6TE zJk?5-`3vdFQAJiO!b0Sdnne!C)?KMqN(qsw!mt@|RXqMG4pkNWN>_m*)Vbk>I~zik zvn1f~$+R{$_SELhp`@nuc)f_Mud1IRkJZnhe&d_u9re5L*YqDV77$JTrhajv@5m8U zI{TqPw6IV%<)|sY%H%kzhx|wcx+YVpg9m@VW5>cHM@LVLjF1b) z1w4LJW>H^;^$;e~Ll!@-xcgX8Mra>eK{WA($!TP!Q*Gm{gj09yNNiFCvGBcC2j`_ zz!C=b!%WY>M%rCYgIs_Jyu0F^HKU=brf6bWDOby)rka$f=^&d;;cbcSGDriUlV(Gr840{&qE-Oe7MD98y9dMUI4gR5l>i z&Faa=#lY#gHTCIdEq{%4APP4u|DR&t&CPd2+R=uq@BBFdf9C$CDHR zsxB@rK1nUYcv)CQgv29FOo$Ap1My9H*u-QYFi)eC==gc#PW0HzuNW^kq=4O8zs4(M z&cGRljSCB}ymGfC8_ZQ*xw|n}pEB`vfRZp0_A-<#_$Ul*5xvy(|FJF$&YMjMHHXUdqPd z2@278scUH*NZ`Z<%+s2Z6NF$biee_xRzWOQNt9c)Du>;h$zm~yoiAGQu7}TV!p?oJuu~2suNnCG#|N$jaWl$0m?RKyd~*c zVuhNnng9Xs27d#%K#>PN%euI>p1%!Z;N0v}`$)1!Zv`2a(;x?UX=NHH4M5a@M@#UD zv7kUx0;@F+B+A=?ObuAn07;hs6uKIbJ#BhVk8T(F#}B;r_E6I*z(sb!L`cT-O#t;0 zBQTh(dJjeK``o+V0-Est-duBe&>vQm3{0X5nic#(Mbc}a7r?igXe}P<_ab!y#f(=b zjMsPXCJ!0EnlOGr9+_`F%`XfNUK||UakD`zE?%64IZK1C^Mr}-F}@uqj==uRa;yyM zH~hP5ps>}tD|!b1lN`&bAj_*D0JN2)oy4)pPL!z(Asy;7%j=nnRbQ7`dlalPoLcMd ziXorOosYWQZdWvtPEV!N(TE#z(o>SmI9<`fup{B9I~?S%uhfdw{-=941!u<4ZVOdhxy6NN=N(W_0$PhX zU5qTH8tqt(YWa?v3I%-->^uf!vhdyo>KWKyF^xfwe47;hn^W+Qe_JXU@pncCEE}wK z;UN657u|q&p3A_)a-dXxEwSBX+ZZg*)xYzqUxCxJs{5HH51ws$E!f*9Q zuIuUO+uBnq2i9jx0!1U5=6dw6wfC&nx;+5Q>4|6IZ( z0-+K$;@f!lF|nHo(6EYTDh+_gR$RR@>qahQIlOa0Nid{gTaRU1E6P?(wFoM`2@%7n z1Y|Z1Jw>deV833~fbLMd50%QmC=dn()CmS9>~v62D&1xjhKmg}2#m2%p(*~|SbJ7M zn<3vHNG1b*&|+VO7uex6w5tWDA}mV*TB8GVYaKS18`;=k!b>6qCZceFrx`x(rx{L) z1{fCgZcY`ly*){lL8Rn$xHsJrW=N8xY#a(jDWE;WCMVJ)6&Z*|2V*1^8_#eY)J299 zi0n@J1DY1_rjaVoD1=f9^%a2$Oe;eALX0Ar8lyKQezQ1HvBo~5+L>*IcitFUPFWl#k#n)$Z1za{1#`O%XD`a!)V{!Gqa7V|%)nn^+ zZkxU{ow2H#T)p~WM;;W*OM4l{x@(EKm3Q9d+Fn`%HKbw00Weas?Wv|x?a`VV><*6&3|tos^0r@mnB(H{{p%;UhP#6he`s#*{#*yc zw1)f(Uo>lln%%x?xILAsdfcM>KHeS-UN7OMCI<?A;1oSbvg{;VXAQD*2f=bZ~5rPjZ-swM$>L|)YTf17$hkBC(dl# zbp4r7U=$y6nS8upViEzYP7<8t5FoEWrZ8zNYosctrj?q`=nPC*Y*S8i)TxCxE9+35 zq$VpT3}b=-RMf5f=+96E+ho?npy7tk;|X`FuN{Xp1YTIE61T^XvFvdH+3 z(P*G`M;4BsM<>o3XN*(tm>yC>;Srd#TlRxBE?DN9*4?PDIS*7j1xBEEP7fZHfivY5 z=r6|ai(=g7EW5WCd?STw>B|-A7HoxE6fjS56QUnhYg^yYkjIW!Y<~XdmAizEYTGVosC9MEkDW7#l1Z?(U z8=3V6^iwXN=6OH{pQM2)08TQwZXbS=pKF|QjkW+iJRON1-M;XjnmrE zaET@v$4$MwkUCXM$D($c&H_W^%?CD>HGgz;?$NRL@-a<~F)MqlBhCMy`a$qJ_itT56+kKe`c-gtatE~|Sr2e2Z=G+80GQ6?+g zUd#%+9kYTQxWB;)a#{|Bu+@F*<+m&@Z=V_mtxEz7-iaL(QX ztD>yK!>zbDbXa~;S<;xMhkVcRL8CkzkCTxWvcZUl-yPj{&)PH7=!Nu`+ID?;_H#F* z5B$n_@$6ahn#+fNIa%uTjveSz#&&f2G}&AKm!|wXZ=UDai5Jo5pzk$J=QObBt2zY? zha-M?yUc|M9^gF0z*+Rt1d_oJEerHimM!pcX<#(iH#kyE=6+o=u|uwLC||pcfrB!ns0MX#%4p3 zX1B90In2>C>;N7&^s_zUqy;+r`MR`2S$tvgM#FUp45Qr2tE4w1Da4^#C_rocDD~pN!|@{aMnxGc8;;L-nfg6t8&WW zN&9#&AIv(vJ&}+u1p8uwY7c2lY&;C+1)yBCKWqc~Il0u3=%E~mfuO@pQEoZWflw+$ zqDY4m33hieCNr{kAOYuRJj>Y;YUiA`aDNnPK!HGbJjQ4tyDC5*1w9n$@jA0XXxEqa zI8w42XPpTzYiBq+O~SdfK+1`=WvbW-H#OyPZyw zvD3+ss3-39tEAMfDk%YY4D^cTJE|pC_oF1Gc0IC*dW0L=f;L+<6csteGYN z*O?&|qOj-KU3Z-%`89{*3!{m{Yp%WPu75jo1|IafaT1+|ODny-6I6fwGm5g!T#Ov00&?=0Mx$mqpnsRwC2NP#i=u(DLZAh~YwxO-dJ$SnVH0s7h-duJI^zu8QmHHnS(CiJu=*>L98FqGnM462` zO!mx%G|VutOcqz`Q{Z*RT&$DpKiXTJadCDEU?|)ebj=S7!?SxrdC?>31N|pz>Ra>y z`jNv(I_LdC|qXCSAXFx4AdDU-LXE z9uR*hUn}3E5DGrb$8_#MpT}qV@M}`h3^ZOY;^_tr5n+coTmt9hh&vj73gU+vez@pL ze6ZnX;6{A3;b$TK#)jVx^6Y6?k%;CYMurs2PeL#5Z1^dNU)S){;D5N`XFwXZH~cKb z?{4_*a4!7qO}8JO-@k9q&i(t~M&0dj4`Ci|BkUvgz|92sUORX2(4PJK;-x|nE-cIu z2Z=+Fgfqn9szre)wl3Z}_3F9ZM{b=x2)7vLpif8OM%yfLuyv6&`}ZA=@1EN?cX0Ob z+^+b|x5wA*+&{H{|Gom8aN}+rhK}uq`u3TforUlmu?ymEhOxzgI(Sr5;Bejo@C43? HTmAkYcoVmx literal 13840 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 literal 13916 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 + + + + IcoMoon Demo + + + + + +
    +

    Font Name: Pythonicon (Glyphs: 40)

    +
    +
    +

    Grid Size: 16

    +
    +
    + + icon-bullhorn +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    +

    Grid Size: Unknown

    +
    +
    + + icon-python-alt +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-pypi +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-news +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-moderate +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-mercurial +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-jobs +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-help +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-download +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-documentation +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-community +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-code +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-close +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-calendar +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-beginner +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-advanced +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-sitemap +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-search +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-search-alt +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-python +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-github +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-get-started +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-feed +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-facebook +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-email +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-arrow-up +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-arrow-right +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-arrow-left +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-arrow-down +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-freenode +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-alert +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-versions +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-twitter +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-thumbs-up +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-thumbs-down +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-text-resize +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-success-stories +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-statistics +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-stack-overflow +
    +
    + + +
    +
    + liga: + +
    +
    +
    +
    + + icon-mastodon +
    +
    + + +
    +
    + liga: + +
    +
    +
    + + +
    +

    Font Test Drive

    + + +
      +
    +
    + +
    +

    Generated by IcoMoon

    +
    + + + + diff --git a/static/fonts/demo/demo.css b/static/fonts/demo/demo.css new file mode 100644 index 000000000..932837ba3 --- /dev/null +++ b/static/fonts/demo/demo.css @@ -0,0 +1,155 @@ +body { + padding: 0; + margin: 0; + font-family: sans-serif; + font-size: 1em; + line-height: 1.5; + color: #555; + background: #fff; +} +h1 { + font-size: 1.5em; + font-weight: normal; +} +small { + font-size: .66666667em; +} +a { + color: #e74c3c; + text-decoration: none; +} +a:hover, a:focus { + box-shadow: 0 1px #e74c3c; +} +.bshadow0, input { + box-shadow: inset 0 -2px #e7e7e7; +} +input:hover { + box-shadow: inset 0 -2px #ccc; +} +input, fieldset { + font-family: sans-serif; + font-size: 1em; + margin: 0; + padding: 0; + border: 0; +} +input { + color: inherit; + line-height: 1.5; + height: 1.5em; + padding: .25em 0; +} +input:focus { + outline: none; + box-shadow: inset 0 -2px #449fdb; +} +.glyph { + font-size: 16px; + width: 15em; + padding-bottom: 1em; + margin-right: 4em; + margin-bottom: 1em; + float: left; + overflow: hidden; +} +.liga { + width: 80%; + width: calc(100% - 2.5em); +} +.talign-right { + text-align: right; +} +.talign-center { + text-align: center; +} +.bgc1 { + background: #f1f1f1; +} +.fgc1 { + color: #999; +} +.fgc0 { + color: #000; +} +p { + margin-top: 1em; + margin-bottom: 1em; +} +.mvm { + margin-top: .75em; + margin-bottom: .75em; +} +.mtn { + margin-top: 0; +} +.mtl, .mal { + margin-top: 1.5em; +} +.mbl, .mal { + margin-bottom: 1.5em; +} +.mal, .mhl { + margin-left: 1.5em; + margin-right: 1.5em; +} +.mhmm { + margin-left: 1em; + margin-right: 1em; +} +.mls { + margin-left: .25em; +} +.ptl { + padding-top: 1.5em; +} +.pbs, .pvs { + padding-bottom: .25em; +} +.pvs, .pts { + padding-top: .25em; +} +.unit { + float: left; +} +.unitRight { + float: right; +} +.size1of2 { + width: 50%; +} +.size1of1 { + width: 100%; +} +.clearfix:before, .clearfix:after { + content: " "; + display: table; +} +.clearfix:after { + clear: both; +} +.hidden-true { + display: none; +} +.textbox0 { + width: 3em; + background: #f1f1f1; + padding: .25em .5em; + line-height: 1.5; + height: 1.5em; +} +#testDrive { + display: block; + padding-top: 24px; + line-height: 1.5; +} +.fs0 { + font-size: 16px; +} +.fs1 { + font-size: 32px; +} +.fs2 { + font-size: 24px; +} + diff --git a/static/fonts/demo/demo.js b/static/fonts/demo/demo.js new file mode 100644 index 000000000..6f45f1c40 --- /dev/null +++ b/static/fonts/demo/demo.js @@ -0,0 +1,30 @@ +if (!('boxShadow' in document.body.style)) { + document.body.setAttribute('class', 'noBoxShadow'); +} + +document.body.addEventListener("click", function(e) { + var target = e.target; + if (target.tagName === "INPUT" && + target.getAttribute('class').indexOf('liga') === -1) { + target.select(); + } +}); + +(function() { + var fontSize = document.getElementById('fontSize'), + testDrive = document.getElementById('testDrive'), + testText = document.getElementById('testText'); + function updateTest() { + testDrive.innerHTML = testText.value || String.fromCharCode(160); + if (window.icomoonLiga) { + window.icomoonLiga(testDrive); + } + } + function updateSize() { + testDrive.style.fontSize = fontSize.value + 'px'; + } + fontSize.addEventListener('change', updateSize, false); + testText.addEventListener('input', updateTest, false); + testText.addEventListener('change', updateTest, false); + updateSize(); +}()); diff --git a/static/fonts/index.html b/static/fonts/index.html deleted file mode 100644 index 703c351ee..000000000 --- a/static/fonts/index.html +++ /dev/null @@ -1,410 +0,0 @@ - - - -Your Font/Glyphs - - - - - -
    -
    -
    -

    Your font contains the following glyphs

    -

    The generated SVG font can be imported back to IcoMoon for modification.

    -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    - - -
    -
    -
    -
    -
    -

    Class Names

    -
    - - -  icon-alert - - - -  icon-arrow-down - - - -  icon-arrow-left - - - -  icon-arrow-right - - - -  icon-arrow-up - - - -  icon-calendar - - - -  icon-close - - - -  icon-code - - - -  icon-documentation - - - -  icon-email - - - -  icon-facebook - - - -  icon-feed - - - -  icon-freenode - - - -  icon-get-started - - - -  icon-github - - - -  icon-help - - - -  icon-pypi - - - -  icon-python - - - -  icon-python-alt - - - -  icon-search - - - -  icon-sitemap - - - -  icon-stack-overflow - - - -  icon-statistics - - - -  icon-success-stories - - - -  icon-text-resize - - - -  icon-thumbs-down - - - -  icon-thumbs-up - - - -  icon-twitter - - - -  icon-versions - - - -  icon-community - - - -  icon-download - - - -  icon-news - - - -  icon-jobs - - - -  icon-beginner - - - -  icon-moderate - - - -  icon-advanced - - - -  icon-search-alt - -
    - -
    - - - diff --git a/static/fonts/style.css b/static/fonts/style.css index 2f45ac8b0..dd31e10f7 100644 --- a/static/fonts/style.css +++ b/static/fonts/style.css @@ -4,148 +4,144 @@ } @font-face { font-family: 'Pythonicon'; - src: url(data:application/x-font-woff;charset=utf-8;base64,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) format('woff'), - url(data:application/x-font-ttf;charset=utf-8;base64,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) format('truetype'); + src: url(data:application/x-font-woff;charset=utf-8;base64,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) format('woff'), + url(data:application/x-font-ttf;charset=utf-8;base64,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) format('truetype'); font-weight: normal; font-style: normal; } -/* Use the following CSS code if you want to use data attributes for inserting your icons */ -[data-icon]:before { - font-family: 'Pythonicon'; - content: attr(data-icon); - speak: none; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - -webkit-font-smoothing: antialiased; +[class^="icon-"], [class*=" icon-"] { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: 'Pythonicon' !important; + speak: never; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; } -/* Use the following CSS code if you want to have a class per icon */ -/* -Instead of a list of all class selectors, -you can use the generic selector below, but it's slower: -[class*="icon-"]:before { -*/ -.icon-alert:before, .icon-arrow-down:before, .icon-arrow-left:before, .icon-arrow-right:before, .icon-arrow-up:before, .icon-calendar:before, .icon-close:before, .icon-code:before, .icon-documentation:before, .icon-email:before, .icon-facebook:before, .icon-feed:before, .icon-freenode:before, .icon-get-started:before, .icon-github:before, .icon-help:before, .icon-pypi:before, .icon-python:before, .icon-python-alt:before, .icon-search:before, .icon-sitemap:before, .icon-stack-overflow:before, .icon-statistics:before, .icon-success-stories:before, .icon-text-resize:before, .icon-thumbs-down:before, .icon-thumbs-up:before, .icon-twitter:before, .icon-versions:before, .icon-community:before, .icon-download:before, .icon-news:before, .icon-jobs:before, .icon-beginner:before, .icon-moderate:before, .icon-advanced:before, .icon-search-alt:before { - font-family: 'Pythonicon'; - speak: none; - font-style: normal; - font-weight: normal; - font-variant: normal; - text-transform: none; - line-height: 1; - -webkit-font-smoothing: antialiased; +.icon-bullhorn:before { + content: "\e600"; } -.icon-alert:before { - content: "\e000"; +.icon-python-alt:before { + content: "\e601"; } -.icon-arrow-down:before { - content: "\e001"; +.icon-pypi:before { + content: "\e602"; } -.icon-arrow-left:before { - content: "\e002"; +.icon-news:before { + content: "\e603"; } -.icon-arrow-right:before { - content: "\e003"; +.icon-moderate:before { + content: "\e604"; } -.icon-arrow-up:before { - content: "\e004"; +.icon-mercurial:before { + content: "\e605"; } -.icon-calendar:before { - content: "\e005"; +.icon-jobs:before { + content: "\e606"; } -.icon-close:before { - content: "\e006"; +.icon-help:before { + content: "\3f"; } -.icon-code:before { - content: "\e007"; +.icon-download:before { + content: "\e609"; } .icon-documentation:before { - content: "\e008"; + content: "\e60a"; } -.icon-email:before { - content: "\e00a"; +.icon-community:before { + content: "\e60b"; } -.icon-facebook:before { - content: "\e00b"; +.icon-code:before { + content: "\e60c"; } -.icon-feed:before { - content: "\e00c"; +.icon-close:before { + content: "\58"; } -.icon-freenode:before { - content: "\e00d"; +.icon-calendar:before { + content: "\e60e"; } -.icon-get-started:before { - content: "\e00e"; +.icon-beginner:before { + content: "\e60f"; } -.icon-github:before { - content: "\e00f"; +.icon-advanced:before { + content: "\e610"; } -.icon-help:before { - content: "\e011"; +.icon-sitemap:before { + content: "\e611"; } -.icon-pypi:before { - content: "\e014"; +.icon-search:before { + content: "\e612"; +} +.icon-search-alt:before { + content: "\e613"; } .icon-python:before { - content: "\e015"; + content: "\e614"; } -.icon-python-alt:before { - content: "\e016"; +.icon-github:before { + content: "\e615"; } -.icon-search:before { - content: "\e017"; +.icon-get-started:before { + content: "\e616"; } -.icon-sitemap:before { - content: "\e018"; +.icon-feed:before { + content: "\e617"; } -.icon-stack-overflow:before { - content: "\e019"; +.icon-facebook:before { + content: "\e618"; } -.icon-statistics:before { - content: "\e01a"; +.icon-email:before { + content: "\e619"; } -.icon-success-stories:before { - content: "\e01b"; +.icon-arrow-up:before { + content: "\e61a"; } -.icon-text-resize:before { - content: "\e01c"; +.icon-arrow-right:before { + content: "\e61b"; } -.icon-thumbs-down:before { - content: "\e01d"; +.icon-arrow-left:before { + content: "\e61c"; } -.icon-thumbs-up:before { - content: "\e01e"; +.icon-arrow-down:before { + content: "\e61d"; } -.icon-twitter:before { - content: "\e01f"; +.icon-freenode:before { + content: "\e61e"; +} +.icon-alert:before { + content: "\e61f"; } .icon-versions:before { - content: "\e020"; + content: "\e620"; } -.icon-community:before { - content: "\e021"; +.icon-twitter:before { + content: "\e621"; } -.icon-download:before { - content: "\e009"; +.icon-thumbs-up:before { + content: "\e622"; } -.icon-news:before { - content: "\e012"; +.icon-thumbs-down:before { + content: "\e623"; } -.icon-jobs:before { - content: "\e013"; +.icon-text-resize:before { + content: "\e624"; } -.icon-beginner:before { - content: "\e022"; +.icon-success-stories:before { + content: "\e625"; } -.icon-moderate:before { - content: "\e023"; +.icon-statistics:before { + content: "\e626"; } -.icon-advanced:before { - content: "\e024"; +.icon-stack-overflow:before { + content: "\e627"; } -.icon-search-alt:before { - content: "\e025"; +.icon-mastodon:before { + content: "\e900"; } diff --git a/static/sass/_fonts.scss b/static/sass/_fonts.scss index 6154dcef1..a12d69881 100644 --- a/static/sass/_fonts.scss +++ b/static/sass/_fonts.scss @@ -5,134 +5,137 @@ */ -@font-face { + @font-face { font-family: 'Pythonicon'; - src: url('../fonts/Pythonicon.eot'); + src:url('../fonts/Pythonicon.eot'); } @font-face { font-family: 'Pythonicon'; - src: url(data:application/x-font-ttf;charset=utf-8;base64,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) format('truetype'), - url(data:application/font-woff;charset=utf-8;base64,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) format('woff'); + src: url(data:application/x-font-woff;charset=utf-8;base64,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) format('woff'), + url(data:application/x-font-ttf;charset=utf-8;base64,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) format('truetype'); font-weight: normal; font-style: normal; } - -.icon-megaphone:before { - content: "\e600"; + +.icon-bullhorn:before { + content: "\e600"; } .icon-python-alt:before { - content: "\e601"; + content: "\e601"; } .icon-pypi:before { - content: "\e602"; + content: "\e602"; } .icon-news:before { - content: "\e603"; + content: "\e603"; } .icon-moderate:before { - content: "\e604"; + content: "\e604"; } .icon-mercurial:before { - content: "\e605"; + content: "\e605"; } .icon-jobs:before { - content: "\e606"; + content: "\e606"; } .icon-help:before { - content: "\3f"; + content: "\3f"; } .icon-download:before { - content: "\e609"; + content: "\e609"; } .icon-documentation:before { - content: "\e60a"; + content: "\e60a"; } .icon-community:before { - content: "\e60b"; + content: "\e60b"; } .icon-code:before { - content: "\e60c"; + content: "\e60c"; } .icon-close:before { - content: "\58"; + content: "\58"; } .icon-calendar:before { - content: "\e60e"; + content: "\e60e"; } .icon-beginner:before { - content: "\e60f"; + content: "\e60f"; } .icon-advanced:before { - content: "\e610"; + content: "\e610"; } .icon-sitemap:before { - content: "\e611"; + content: "\e611"; } .icon-search-alt:before { - content: "\e612"; + content: "\e612"; } .icon-search:before { - content: "\e613"; + content: "\e613"; } .icon-python:before { - content: "\e614"; + content: "\e614"; } .icon-github:before { - content: "\e615"; + content: "\e615"; } .icon-get-started:before { - content: "\e616"; + content: "\e616"; } .icon-feed:before { - content: "\e617"; + content: "\e617"; } .icon-facebook:before { - content: "\e618"; + content: "\e618"; } .icon-email:before { - content: "\e619"; + content: "\e619"; } .icon-arrow-up:before { - content: "\e61a"; + content: "\e61a"; } .icon-arrow-right:before { - content: "\e61b"; + content: "\e61b"; } .icon-arrow-left:before { - content: "\e61c"; + content: "\e61c"; } .icon-arrow-down:before { - content: "\e61d"; + content: "\e61d"; } .icon-freenode:before { - content: "\e61e"; + content: "\e61e"; } .icon-alert:before { - content: "\e61f"; + content: "\e61f"; } .icon-versions:before { - content: "\e620"; + content: "\e620"; } .icon-twitter:before { - content: "\e621"; + content: "\e621"; } .icon-thumbs-up:before { - content: "\e622"; + content: "\e622"; } .icon-thumbs-down:before { - content: "\e623"; + content: "\e623"; } .icon-text-resize:before { - content: "\e624"; + content: "\e624"; } .icon-success-stories:before { - content: "\e625"; + content: "\e625"; } .icon-statistics:before { - content: "\e626"; + content: "\e626"; } .icon-stack-overflow:before { - content: "\e627"; + content: "\e627"; +} +.icon-mastodon:before { + content: "\e900"; } @@ -143,7 +146,7 @@ */ /*modernizr*/ .no-fontface, .no-svg, .no-generatedcontent { - .icon-megaphone, .icon-python-alt, .icon-pypi, .icon-news, .icon-moderate, .icon-mercurial, .icon-jobs, .icon-help, .icon-download, .icon-documentation, .icon-community, .icon-code, .icon-close, .icon-calendar, .icon-beginner, .icon-advanced, .icon-sitemap, .icon-search, .icon-search-alt, .icon-python, .icon-github, .icon-get-started, .icon-feed, .icon-facebook, .icon-email, .icon-arrow-up, .icon-arrow-right, .icon-arrow-left, .icon-arrow-down, .icon-freenode, .icon-alert, .icon-versions, .icon-twitter, .icon-thumbs-up, .icon-thumbs-down, .icon-text-resize, .icon-success-stories, .icon-statistics, .icon-stack-overflow { + .icon-megaphone, .icon-python-alt, .icon-pypi, .icon-news, .icon-moderate, .icon-mercurial, .icon-jobs, .icon-help, .icon-download, .icon-documentation, .icon-community, .icon-code, .icon-close, .icon-calendar, .icon-beginner, .icon-advanced, .icon-sitemap, .icon-search, .icon-search-alt, .icon-python, .icon-github, .icon-get-started, .icon-feed, .icon-facebook, .icon-email, .icon-arrow-up, .icon-arrow-right, .icon-arrow-left, .icon-arrow-down, .icon-freenode, .icon-alert, .icon-versions, .icon-twitter, .icon-thumbs-up, .icon-thumbs-down, .icon-text-resize, .icon-success-stories, .icon-statistics, .icon-stack-overflow, .icon-mastodon { &:before { display: none; @@ -159,7 +162,7 @@ /* Show in IE8: supports FontFace (eot) but not SVG. */ .ie8 { - .icon-megaphone, .icon-python-alt, .icon-pypi, .icon-news, .icon-moderate, .icon-mercurial, .icon-jobs, .icon-help, .icon-download, .icon-documentation, .icon-community, .icon-code, .icon-close, .icon-calendar, .icon-beginner, .icon-advanced, .icon-sitemap, .icon-search, .icon-search-alt, .icon-python, .icon-github, .icon-get-started, .icon-feed, .icon-facebook, .icon-email, .icon-arrow-up, .icon-arrow-right, .icon-arrow-left, .icon-arrow-down, .icon-freenode, .icon-alert, .icon-versions, .icon-twitter, .icon-thumbs-up, .icon-thumbs-down, .icon-text-resize, .icon-success-stories, .icon-statistics, .icon-stack-overflow { + .icon-megaphone, .icon-python-alt, .icon-pypi, .icon-news, .icon-moderate, .icon-mercurial, .icon-jobs, .icon-help, .icon-download, .icon-documentation, .icon-community, .icon-code, .icon-close, .icon-calendar, .icon-beginner, .icon-advanced, .icon-sitemap, .icon-search, .icon-search-alt, .icon-python, .icon-github, .icon-get-started, .icon-feed, .icon-facebook, .icon-email, .icon-arrow-up, .icon-arrow-right, .icon-arrow-left, .icon-arrow-down, .icon-freenode, .icon-alert, .icon-versions, .icon-twitter, .icon-thumbs-up, .icon-thumbs-down, .icon-text-resize, .icon-success-stories, .icon-statistics, .icon-stack-overflow, .icon-mastodon { &:before { display: inline; diff --git a/static/sass/style.css b/static/sass/style.css index 472737c2a..ad49c77b4 100644 --- a/static/sass/style.css +++ b/static/sass/style.css @@ -3391,7 +3391,7 @@ span.highlighted { */ /* ! ===== ICONS ===== */ /* Look inside _fonts.scss for most of the code. We declare this here so we can adjust as needed for specific elements. */ -.icon-megaphone, .icon-python-alt, .icon-pypi, .icon-news, .icon-moderate, .icon-mercurial, .icon-jobs, .icon-help, .icon-download, .icon-documentation, .icon-community, .icon-code, .icon-close, .icon-calendar, .icon-beginner, .icon-advanced, .icon-sitemap, .icon-search, .icon-search-alt, .icon-python, .icon-github, .icon-get-started, .icon-feed, .icon-facebook, .icon-email, .icon-arrow-up, .icon-arrow-right, .icon-arrow-left, .icon-arrow-down, .errorlist:before, .icon-freenode, .icon-alert, .icon-versions, .icon-twitter, .icon-thumbs-up, .icon-thumbs-down, .icon-text-resize, .icon-success-stories, .icon-statistics, .icon-stack-overflow { +.icon-megaphone, .icon-python-alt, .icon-pypi, .icon-news, .icon-moderate, .icon-mercurial, .icon-jobs, .icon-help, .icon-download, .icon-documentation, .icon-community, .icon-code, .icon-close, .icon-calendar, .icon-beginner, .icon-advanced, .icon-sitemap, .icon-search, .icon-search-alt, .icon-python, .icon-github, .icon-get-started, .icon-feed, .icon-facebook, .icon-email, .icon-arrow-up, .icon-arrow-right, .icon-arrow-left, .icon-arrow-down, .errorlist:before, .icon-freenode, .icon-alert, .icon-versions, .icon-twitter, .icon-thumbs-up, .icon-thumbs-down, .icon-text-resize, .icon-success-stories, .icon-statistics, .icon-stack-overflow, .icon-mastodon { font-family: 'Pythonicon'; speak: none; font-style: normal; @@ -3406,7 +3406,7 @@ span.highlighted { /* Hide a unicode fallback character when we supply it by default. * In fonts.scss, we hide the icon and show the fallback when other conditions are not met */ } - .icon-megaphone span, .icon-python-alt span, .icon-pypi span, .icon-news span, .icon-moderate span, .icon-mercurial span, .icon-jobs span, .icon-help span, .icon-download span, .icon-documentation span, .icon-community span, .icon-code span, .icon-close span, .icon-calendar span, .icon-beginner span, .icon-advanced span, .icon-sitemap span, .icon-search span, .icon-search-alt span, .icon-python span, .icon-github span, .icon-get-started span, .icon-feed span, .icon-facebook span, .icon-email span, .icon-arrow-up span, .icon-arrow-right span, .icon-arrow-left span, .icon-arrow-down span, .errorlist:before span, .icon-freenode span, .icon-alert span, .icon-versions span, .icon-twitter span, .icon-thumbs-up span, .icon-thumbs-down span, .icon-text-resize span, .icon-success-stories span, .icon-statistics span, .icon-stack-overflow span { + .icon-megaphone span, .icon-python-alt span, .icon-pypi span, .icon-news span, .icon-moderate span, .icon-mercurial span, .icon-jobs span, .icon-help span, .icon-download span, .icon-documentation span, .icon-community span, .icon-code span, .icon-close span, .icon-calendar span, .icon-beginner span, .icon-advanced span, .icon-sitemap span, .icon-search span, .icon-search-alt span, .icon-python span, .icon-github span, .icon-get-started span, .icon-feed span, .icon-facebook span, .icon-email span, .icon-arrow-up span, .icon-arrow-right span, .icon-arrow-left span, .icon-arrow-down span, .errorlist:before span, .icon-freenode span, .icon-alert span, .icon-versions span, .icon-twitter span, .icon-thumbs-up span, .icon-thumbs-down span, .icon-text-resize span, .icon-success-stories span, .icon-statistics span, .icon-stack-overflow span, .icon-mastodon span { display: none; } /* Keep this at the bottom since it will create a huge set of data */ @@ -3415,130 +3415,138 @@ span.highlighted { * Be sure to upgrade to at least 0.12.1 to have this work properly. * in Terminal, gem install compass --version '= 0.12.1' */ + @font-face { + font-family: 'Pythonicon'; + src:url('../fonts/Pythonicon.eot'); +} @font-face { - font-family: 'Pythonicon'; - src: url("../fonts/Pythonicon.eot"); } -@font-face { - font-family: 'Pythonicon'; - src: url(data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg6v81EAAAC8AAAAYGNtYXCyYwFRAAABHAAAAFxnYXNwAAAAEAAAAXgAAAAIZ2x5ZobYFk4AAAGAAAAxlGhlYWQAPUVrAAAzFAAAADZoaGVhB8MD6QAAM0wAAAAkaG10eKIMAoAAADNwAAAAqGxvY2H4mupyAAA0GAAAAFZtYXhwADkCzAAANHAAAAAgbmFtZY9a7EIAADSQAAABXXBvc3QAAwAAAAA18AAAACAAAwQAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAACDmJwPA/8D/wAPAAEAAAAAAAAAAAAAAAAAAAAAgAAAAAAACAAAAAwAAABQAAwABAAAAFAAEAEgAAAAOAAgAAgAGACAAPwBY5gbmDOYn//8AAAAgAD8AWOYA5gjmDv///+H/w/+rGgQaAxoCAAEAAAAAAAAAAAAAAAAAAAABAAH//wAPAAEAAAAAAAAAAAACAAA3OQEAAAAAAwAA/8AEAAPAABgAHQBxAAABISIOAhURFB4CMyEyPgI1ETQuAiMDIzUzFRMOAwcOAwcOAxUjNTQ+Ajc+Azc+Azc+AzU0LgInLgMjIg4CBw4DByc+Azc+AzMyHgIXHgMVFA4CBwMF/fc0W0QoKERbNAIJNFtEKChEWzS0ubmcBREWHBEMEw8LAwMFAwKyAQMEAwMGCAkFBREXHRIJDgkFAgQGBAQKDA0ICA8ODAUFCQcFArUCCxIZEBAoMTkhGi4pJBAVIBULAwUIBgPAKERbNP33NFtEKChEWzQCCTRbRCj8f76+AecJFRcZDQkRDw0GBhQXFwknCxUSEAcHDg0MBgYQFRkPCA8ODgYGCwoJBAQFBAIDBQgFBQ8TFw4WGS0oIw8PFw8IBQsQCw4iJisYChQTEwkAAAAAAv/+/8ID/gPCABgAJQAAASEiDgIVERQeAjMhMj4CNRE0LgIjEwcnByc3JzcXNxcHFwMC/fc0W0QoKERbNAIJNFtEKChEWzQ3m6Cgm6Cgm6Cgm6CgA8IoRFs0/fc0W0QoKERbNAIJNFtEKP1fm6Cgm6Cgm6Cgm6CgAAAAAAUAAAACBAADgAAqAGcAiQCYANUAAAE0LgIjOAMxIzAOAgcOAxUUHgIXHgMxMzgDMTI+AjUDIi4CJy4DJy4DNTQ+Ajc+Azc+AzMyHgIXHgMXHgMVFA4CBw4DBw4DIwE0PgI3DgMjKgMxBxUXMDoCMzIeAhcuAzUXJxMeAz8BPgImLwElIi4CJy4DJy4DNTQ+Ajc+Azc+AzMyHgIXHgMXHgMVFA4CBw4DBw4DIwQAFSQwG1NGfq9pAwUEAgIEBQNpr35GUxswJBWfBAcHBgIFCQkIBAkNCQUFCQ0JBAgJCQUCBgcHBAQHBwYCBQkJCAQJDQkFBQkNCQQICQkFAgYHBwT9mwEDBAMSIiIjExkbDQI3NwINGxkTIyIiEgMEAwF0gFICBwoMBncGCAQBA3sB8QEDAwIBAgQDAwIDBQQCAgQFAwIDAwQCAQIDAwEBAwMCAQIEAwMCAwUEAgIEBQMCAwMEAgECAwMBAhNLhWM6MEJFFhElKCwXFywoJREWRUIwOmOFS/7KAwUFAgUNEBIKFzU7PyEhPzs1FwoSEA0FAgUFAwMFBQIFDRASChc1Oz8hIT87NRcKEhANBQIFBQMBNhMmJSQRAgQDAV9YXwEDBAIRJCUmE9UZ/r4GCQUBAi8CCQsMBuVdAQICAQIFBgcECRUXGA0NGBcVCQQHBgUCAQICAQECAgECBQYHBAkVFxgNDRgXFQkEBwYFAgECAgEAAAAEABr/7gPjA9MANQBKAHsAkAAAAS4DIyIOAgcOAx0BMxUhIg4CBw4BFBYXHgM7ATU0PgI7ATI+Aj0BNC4CJwciLgI1ND4CMzIeAhUUDgIjBS4DKwEVFA4CKwEiDgIdARQeAhceAjY3PgM9ASM1ITI+Ajc+ATQmJwEyHgIVFA4CIyIuAjU0PgIzAm0PHx8fDw8eHRsNJi8aCe7+uRowJx0HCAgICQYWHykaUhgpNh7uGSsgExMhKxjhCRAMBwcMEAkJEAwHBwwQCQJXBhMcJxpZGCk2Hu4YKyATEyErGBw4Oj4iFishFO4BZRolGxQJCQkJCf6OCRAMBwcMEAkJEAwHBwwQCQPJAwQCAQECBAIHFR4oGlseDx4tHiI5ODsjGiwgEm0dNikYEyEsGeMYKiAWBJoHDBAJCREMBwcMEQkJEAwH5RosIBJqHzcpGBMhLBjjGCceFQcICQEJCgYUHScaWx4RICwbHDg7QCT+OwcMEAkJEQwHBwwRCQkQDAcAAAAH//7/2AP+A9gAGAAnACwAOwBAAEUASgAAASEiDgIVERQeAjMhMj4CNRE0LgIjExQOAiMhIi4CPQEhFTUhNSEVESE1ND4CMyEyHgIdASUhNSEVASEVITURIRUhNQMC/fc0W0QoKERbNAIJNFtEKChEWzS8ITdGJf4KJEY3IgN9/IMDffyDITdGJQH2JUY3If3CAQX++wEF/vsBBf77AQUD2ChEWzT99zRbRCgoRFs0Agk0W0Qo/QImRzYhITZHJkFBf/7+ATs8JEY3IiI3RiQ8YT4+/wA+Pv7CPj4ACAAA/8MD/gPDABoAMQA2ADsAQABFAEoATwAAAREUDgIxMDQYATUFERQeAjMhMj4CNREjAzAOAiMwKgIjIi4CNTwDMSERAzUhFSEFIRUhNREhFSE1NSEVITUVIRUhNSU1IREhA74UGBT8gihEWzQCBzRbRChAfgoSGxGIraIbIkY4JAL9Pf2DAn39gwE7/sUCe/2FATv+xQE7/sUCff78AQQDA/3BJDEeDekBMQEnPgH8/DRbRCgoRFs0AkT9GgcJByE2RSQk5PXA/JwC9S9+f0JC/oJCQv5CQn5CQgL7/sAAAAAABQBCAAgDtwN9ABQAIQA4AE8AXAAAASIOAhUUHgIzMj4CNTQuAiMBJz4DNxcOAwcTIi4CNTQ+Aj8BFx4DFRQOAiMRIg4CByc+AzMyHgIXBy4DIwUuAyc3HgMXBwH8XKF4RkZ4oVxcoXhGRnihXP6oFggZICcXIhQmIyAO9RQjGg8IDxQMKy0LEg0HDxojFAkREREIJhYxNDccDRsaGQxUDh0eHxABQwwiKzMdVTFUPycFnQN9RnihXFyheEZGeKFcXKF4Rv6aFhw1MCsSgAYRFRkO/qwPGiMUDhoWEgbGygYRFRgNFCMaDwG5AQIDAo4OFg8IAgQFA8oFCAUD2R42LiYOzRNAU2Q3QQAAAAYAA//BBAIDwAAYADIAPwCOAKQAuQAAATIeAhURFA4CIyEiLgI1ETQ+AjMhNSEiDgIVERQeAjMhMj4CNRE0LgIjMQE1IxUjETMVMzUzESMXIi4CNTQ+AjcnND4CNy4DNTQ+AjMyHgIXHgMzMj4CNxcOAyMeAxUUDgIHIg4CFRQeAh8BHgMVFA4CIzcnDgMVFB4CMzI+AjU0LgInAyIOAhUUHgIzMj4CNTQuAiMDVwkQDAcHDBAJ/VcJEAwHBwwQCQKp/VcjPi8bGy8+IwKpIz4vGxsvPiP+T3dBQXdCQvQdLiARChAUCx4GCQsGChALBg8bJxgGCgkIAwQJCQoFBgwKCQMJAgYICAQCBAMCDhomGAgMCQUBAwQDPxMeFQsRIC4cGCkMEw4HCBEZERAZEAgFCg8KGwoSDQcHDRIKChINCAcNEgsDQAcMEAn9VwkQDAcHDBAJAqkJEAwHgBsvPiP9VyM+LxsbLz4jAqkjPi8b/VbNzQHRy8v+L50SHyoZEyAYEQQgCA8NCgMHEhYbEBgoHRABAQIBAQIBAQIDBAI0AQMCAQQLDQ8IFigeEgECBQcFAgQEBAEWBxQbIxUXKB0RqAwBChEXDg0YEgsKERULChMQCwMBFQkRFg0NFhAJCRAWDQ0WEQkAAwAB/8IEAQOCACUAYwCEAAABBRUUDgIjIi4CPQElIi4CMREUHgIzITI+AjURMA4CIxEjNTQuAicuAysBIg4CBw4DHQEjIg4CHQEUHgIzBRUUHgIzMj4CPQElMj4CPQE0LgIjJTQ+Ajc+AzsBMh4CFx4DFRwDFSM8AzUDg/7dERsiEREiGxH+3BouIhQUIi4aAwUaLiIUFCIuGsIECQ0JCRUYGg2CDRoYFQkJDQkEwBouIhQUIi4aAVMHDREKChENBwFTGi4iFBQiLhr9/gIEBQMDCQsOCYIJDgsJAwMFBAL+ARkyHREeFg0NFh4RHTIUGBT+5houIhQUIi4aARoUGBQBqEIOGhgVCQkNCAQECA0JCRUYGg5CFCIuGoAaLiIUODQKEQ0ICA0RCjQ4FCIuGoAaLiIUQgkOCwgDAwUEAgIEBQMDCAsOCQgREREICBEREQgAAAUAAP/CBAADwgAeADgAUQCcAKkAAAEiDgIVFB4CMzI+AjU8AS4BJy4DJy4DIwMmDgIXHgMXMDoCMTI+AicuAyclISIOAhURFB4CMyEyPgI1ETQuAiMBFA4CBw4DFRQeAhceAxUUDgIjIi4CNTQ+AjM6AzMuAzU0PgI3KgMjIi4CNTQ+AjMxMwcjHgMVBSMVIzUjNTM1MxUzFQFEHzksGhUmNR8sPCUQAQEBAw8WHREGDQ4OBxwVIhcKBAQWICgVAQEBFCEWCQQEFiAoFQHd/fc0W0QoKERbNAIJNFtEKChEWzT+6AkQFw0NEAkDDBIUBxUdEggcNk8zLVE9JCE5Ti0FCQkJBQYLCAUCAwQCAgUFBQMlPSsYIDVEJNkxRREaEgkBqIUxhYUxhQFKEh8pFxgqIBIRHikYAwYGBgMNFRMTDAIDAgEBlgETIi8cGzElFgEUIy8bHDAkFQHiKERbNP33NFtEKChEWzQCCTRbRCj+nREgHRkLCg8ODgkHExMRBQ8eIScYHTgsGxIhLx0eOCwaBg0PEAkFCwoKBRkrOSEgOiwaIwcZIScUFoWFMYWFMQAAAAAC////wgP/A4EABgAYAAATCQEjESERBQcnIRUUHgIzITI+Aj0BIYEBfwF8vv6CAaDg4f7gKERbNAIJNFtEKP7iAkD+gQF/AUD+wPzh4Yc0W0QoKERbNIcABgAA/8IEAAPCAA4AJwA8AFEAZgB1AAABBycDFzcXARcHFz8CASchIg4CFREUHgIzITI+AjURNC4CIwEiLgI1ND4CMzIeAhUUDgIjNSIuAjU0PgIzMh4CFRQOAiM1Ii4CNTQ+AjMyHgIVFA4CIwEUDgIHJREhMh4CFREC2xlbuiihM/61CiQGHyQ0AX45/fc0W0QoKERbNAIJNFtEKChEWzT9XwoRDQcHDREKChENBwcNEQoKEQ0HBw0RCgoRDQcHDREKChENBwcNEQoKEQ0HBw0RCgNYIjtPLf3hAh8tTzsiAyonOv7bGf0g/fczOh8IOQ0CWNcoRFs0/fc0W0QoKERbNAIJNFtEKPzSCA0RCgoSDQgIDRIKChENCP4IDREKChINCAgNEgoKEQ0I/ggNEQoKEg0ICA0SCgoRDQj+US1PPCMBAgN3IjtPLf49AAAABwB4/8MDiAO+ABQAKQA8AFEAZAByAJcAAAEyPgI1NC4CIyIOAhUUHgIzFzI+AjU0LgIjIg4CFRQeAjMXIg4CBx4DHQEzNTQuAiMlMj4CNTQuAiMiDgIVFB4CMwciDgIdATM1ND4CNy4DIyUiDgIdASE1NC4CIwE0LgIjIg4CFRQeAhcHNx4DMxc3Mj4CNxcnPgM1AgEWJhwQEBwmFhYmHBAQHCYW+xEeFg0NFh4RER4WDQ0WHhEWDxsYFQgDBQMCyRMgKxj98xEeFg0NFh4RER4WDQ0WHhEWGCsgE8kCAwUDCBUYGw8BEyA4KhgBMhgqOCABezxnik9Oimc8GCw+JhFgChQUFAoxMQsVFRQKYBEmPiwYARUQHCYWFiYcEBAcJhYWJhwQHA0WHhERHhYNDRYeEREeFg0lBgwRCgYNDg4HbmQXKB4RJQ0WHhERHhYNDRYeEREeFg0lER4oF2RuBw4ODQYKEQwGIhcnNB6ioh40JxcCSRouIhQUIi4aER8bFwmtoAECAgHCwgECAgGgrQkXGx8RAAAABAAA/8AEAAPAABgAHwAkACsAAAEhIg4CFREUHgIzITI+AjURNC4CIwEHFxUnNxUTIxM3Azc1Nyc1FwcDBf33NFtEKChEWzQCCTRbRCgoRFs0/jd9ff//kUyrTavud3f5+QPAKERbNP33NFtEKChEWzQCCTRbRCj+bmxscNzccP5ZAncB/YhjcGdncNjYAAAADgAA/8IEAAPCABgALQBCAFcAZgBrAHAAdQB6AH8AhACMAJEAlgAAASEiDgIVERQeAjMhMj4CNRE0LgIjBzIeAhUUDgIjIi4CNTQ+AjMjMh4CFRQOAiMiLgI1ND4CMyMyHgIVFA4CIyIuAjU0PgIzASEiLgInEyERFA4CIwMzFSM1OwEVIzUFMxUjNTsBFSM1OwEVIzU7ARUjNQE1IxQeAjM3MxUjNTsBFSM1AwX99zRbRCgoRFs0Agk0W0QoKERbNAcKEg0ICA0SCgoRDQgIDREK/goSDQgIDRIKChENCAgNEQr+ChINCAgNEgoKEQ0ICA0RCgHa/j0tTzwjAQIDdyI7Ty3Hl5fMl5f9nJeXzJeXzJeXzJeX/jKXHCw1GTaXl8yXlwPCKERbNP33NFtEKChEWzQCCTRbRChVBw0RCgoRDQcHDREKChENBwcNEQoKEQ0HBw0RCgoRDQcHDREKChENBwcNEQoKEQ0H/JkiO08tAd/+IS1POyICeZOTk5PVk5OTk5OTk5P+mJMfNigXk5OTk5MAAAAABQBCAAgDtwN9ABQAIQA9AFQAYQAAASIOAhUUHgIzMj4CNTQuAiMBJz4DNxcOAwcTIi4CNTQ+AjcnFz4DMzIeAhUUDgIjESIOAgcnPgMzMh4CFwcuAyMFLgMnNx4DFwcB/FyheEZGeKFcXKF4RkZ4oVz+qBYIGSAnFyIUJiMgDvUUIxoPAQECAW+uAwcHBwQUIxoPDxojFAkREREIJhYxNDccDRsaGQxUDh0eHxABQwwiKzMdVTFUPycFnQN9RnihXFyheEZGeKFcXKF4Rv6aFhw1MCsSgAYRFRkO/qwPGiMUBAcHBwOtbgECAQEPGiMUFCMaDwG5AQIDAo4OFg8IAgQFA8oFCAUD2R42LiYOzRNAU2Q3QQAAAAUAQgAIA7cDfQAUACsAOABUAGEAAAEiDgIVFB4CMzI+AjU0LgIjFTIeAhcHLgMjIg4CByc+AzMBJz4DNxcOAwcFHgIUFRQOAiMiLgI1ND4CMzIeAhc3BzcuAyc3HgMXBwH8XKF4RkZ4oVxcoXhGRnihXA0bGhkMVA4dHh8QCREREQgmFjE0Nxz+qBYIGSAnFyIUJiMgDgFSAQEBDxojFBQjGg8PGiMUBQkJCQSqcOYMIiszHVUxVD8nBZ0DfUZ4oVxcoXhGRnihXFyheEY9AgQFA8oFCAUDAQIDAo4OFg8I/tcWHDUwKxKABhEVGQ7fAwUFBQMUIxoPDxojFBQjGg8BAgMCbrFrHjYuJg7NE0BTZDdBAAMAAP/CBAADwgAYACYAMAAAASEiDgIVERQeAjMhMj4CNRE0LgIjBSE1MxUhFSEVIzUhJzcBIREjESE1IRcHAwX99zRbRCgoRFs0Agk0W0QoKERbNP3AARdHAR7+4kf+6WdnAnP+60f+5wJ1Z2cDwihEWzT99zRbRCgoRFs0Agk0W0QowD09wz4+YGP+AP8AAQDCYWAAAAAABP/+/8AD/gPAABQAIQA6AGoAABMOARQWFx4BMjY3PgE0JicuASIGBxc0LgIjNTIeAhUjASEiDgIVERQeAjMhMj4CNRE0LgIjEwcOASImLwEuATQ2PwEnDgEuAScuATQ2Nz4BMhYXHgIGBxc3PgEyFh8BHgEUBge/HR0dHR1KTUodHR0dHR1KTUod+xUlMhwiOywaGwFI/fc0W0QoKERbNAIJNFtEKChEWzSuaQYPDw8G/QYGBgYcPidcXlkkJycnJydiZmInJCcGGx4+HAYPDw8G/QYGBgYDAh1KTUodHR0dHR1KTUodHR0dHagcMiUVGxosOyIBZihEWzT99zRbRCgoRFs0Agk0W0Qo/LppBgYGBv0GDw8PBhw+HhsGJyQnYmZiJycnJyckWV5cJz4cBgYGBv0GDw8PBgAAAAMAkQARA7ADMAAUACEAUQAAEw4BFBYXHgEyNjc+ATQmJy4BIgYHFzQuAiM1Mh4CFSMBBw4BIiYvAS4BNDY/AScOAS4BJy4BNDY3PgEyFhceAgYHFzc+ATIWHwEeARQGB78dHR0dHUpNSh0dHR0dHUpNSh37FSUyHCI7LBobAfZpBg8PDwb9BgYGBhw+J1xeWSQnJycnJ2JmYickJwYbHj4cBg8PDwb9BgYGBgMCHUpNSh0dHR0dHUpNSh0dHR0dqBwyJRUbGiw7Iv4gaQYGBgb9Bg8PDwYcPh4bBickJ2JmYicnJycnJFleXCc+HAYGBgb9Bg8PDwYABQAA/8IEAAPCABQAKQBCAHgAqQAAJTI+AjU0LgIjIg4CFRQeAjMDIg4CFRQeAjMyPgI1NC4CIyUhIg4CFREUHgIzITI+AjURNC4CIwEVIyIuAicuATQ2Nz4DMyE1IzU0PgI3PgMzMh4CFx4DHQEUDgIrASIOAhUFDgMjIRUzFRQOAgcOAS4BJy4DPQE0PgI7ATI+Aj0BMzIeAhceARQGBwJgCA0KBgYKDQgIDQoGBgoNCL4IDQoGBgoNCAgNCgYGCg0IAWL99zRbRCgoRFs0Agk0W0QoKERbNP4ZQxUiGhIFBwcHBwYYICcVAQ7EBxUmHwsXGBkNDRoaGg0UJBsQDxskFMQZLSIUAnQHEBYeFf7axBEcIxMcMzAuFxMkGxAQGyQUxBgsIhRKFSAXEAUHCAcIYAYKDggIDgoGBgoOCAgOCgYCyAYKDggIDgoGBgoOCAgOCgaaKERbNP33NFtEKChEWzQCCTRbRCj9nFoPGiUWHTEuLxwYJRkNGUsVIRkRBgIDAgEBAgMCAxIbIhS7FSQbEBQiLBgFFiUaDhlLFSAYEQUIBwEIBwYSGSAUuxQkGxAUIi0ZVw8bJBUeNDEuFwAAAAAEAAD/wAQAA8AAFAApAEIBIQAAASIOAhUUHgIzMj4CNTQuAiMhIg4CFRQeAjMyPgI1NC4CIwEhIg4CFREUHgIzITI+AjURNC4CIxMUDgIPAQ4DDwEOAw8BFx4DFxUUHgIXLgM9ATQuAiMwIjgBMQcVMBwCFRQeAhcuAzUwPAI1NC4CIyIOAhUcAzEUDgIjPgM9AQcwDgIdARQOAgc+Az0BIyIuAiceAxc6AzEzNz4DPwEnLgMvAS4DLwEuAzU8AzU0PgI/AScuAzU0PgI3HgMfATc+AzMyHgIfATc+AzceAxUcAQ4BBxUXHgMVMBwCMQKODBUQCQkQFQwMFRAJCRAVDP78DBUQCQkQFQwMFRAJCRAVDAF8/fc0W0QoKERbNAIJNFtEKChEWzRRAgMFAwMBAQEBAQQNJjI+JAwIBwsHBAECBAUDDRYQCQYHBgEBBQECBAMOFA0GAwQFAgIFBAIJDxUMAgMCAQcGBwYIDhQNAgQDATooLB0bFxUhIiccERYNBQYBAQYKDgkMDyhCNSkOBQEBAQEBBAQGBAIGDhYPAgECAwIBAQMEAxEjIyQSAgMPHh4eDw8fHx8PAwIQISMlEwMFAwIBAQECDhcQCQJLCRAWDAwWEAkJEBYMDBYQCQkQFgwMFhAJCRAWDAwWEAkBdShEWzT99zRbRCgoRFs0Agk0W0Qo/nEMFxUUCQkCAwMDAgkZKB4UBgIJCBAREQmsBQkICAMBBgkNCI8HCAQBAQUwPTYGBAgIBwMBBwsOCC45MgMDBQMCAgMFAwM0PDEJDAgEAwYHCAS0AQEECAeTBw0LBwEDBwgIBXcgLjMTAxwfGgEGChIREAcKAgUTHScZCQEDAwMCCQoVFxgNAQEBAQEWKSckEAMDCA8PDwgJExMTCQEHDRIMAQEDBQMCAgMFAwECCxENCAILFhYWCwUKCgoFAwIRJiswGwEBAQAAAAACACL/wgPgA7oAFgBBAAABMj4CNRE0LgIjIg4CFREUHgIzExUeAxUUDgIjIi4CNTQ+Ajc1DgMVFB4CMzI+AjU0LgInAgANFhAKChAWDQ0WEAoKEBYNwCQ7Khc3X39ISIBfNxcpOiQ/aUwqS4KuY2OugksqTGo/AX4JEBcPAb4PFxAJCRAXD/5CDxcQCQHakhc/S1UuSH9fNzdff0guVUs/F5IcWXKHSmOugktLgq5jSodyWRwAAAAABP/+/8AD/gPAABgALQBOAG8AAAEhIg4CFREUHgIzITI+AjURNC4CIwEiLgI1ND4CMzIeAhUUDgIjJSM+AzU0LgIjIg4CBzU+AzMyHgIVFA4CBzMjPgM1NC4CIyIOAgc1PgMzMh4CFRQOAgcDAv33NFtEKChEWzQCCTRbRCgoRFs0/ikYKyATEyArGBgrIBMTICsYATiRBwsIBB81SCkPHRsZDA0aGxwORHhZNAIEBgTnlQMFBAJAb5VVDhwbGg0NGxsbDnPKllcBAgQCA8AoRFs0/fc0W0QoKERbNAIJNFtEKPy2EyArGBgrIBMTICsYGCsgEw4LGBobDilINR8ECAwIkwQHBQM0WXhEDhsaGQwMGRoaDVWVb0ACBAYElQMEAwFXlspzDRoaGg0AAgAA/8IEAAPCABgAMQAAASEiDgIVERQeAjMhMj4CNRE0LgIjAyMRIxEjNTM1ND4COwEVIyIOAh0BMwcDBf33NFtEKChEWzQCCTRbRCgoRFs0X2meT08SKEEvaUISFQoDdw4DwihEWzT99zRbRCgoRFs0Agk0W0Qo/gL+ggF+hE8oQCwXhAcNFA1ChAAE//4AhgP+AwQADwATABcAJwAAASEiDgIdAQUBNTQuAiMTNQcXJRU3JwUnBRQeAjMhMj4CNSUHA4D8+xouIhQB/gICFCIuGn79/fwA+fkB/sD+wxQiLhoDBRotIhT+v8EDBBQiLhoF/QEAAxouIhT+Qfx+fvr4fHz9YJ4aLiIUEyItGp9gAAAAAv/+/8ID/gPCABgAIAAAASEiDgIVERQeAjMhMj4CNRE0LgIjAxEhESMJASMDAv33NFtEKChEWzQCCTRbRCgoRFs0Qf6CvgF8AX+/A8IoRFs0/fc0W0QoKERbNAIJNFtEKP4C/sABQAF//oEAAv/+/8ID/gPCABgAIAAAASEiDgIVERQeAjMhMj4CNRE0LgIjATUhESE1CQEDAv33NFtEKChEWzQCCTRbRCgoRFs0/v3+wAFAAX/+gQPCKERbNP33NFtEKChEWzQCCTRbRCj8fb8Bfr7+hP6BAAAAAAL//v/CA/4DwgAYACAAAAEhIg4CFREUHgIzITI+AjURNC4CIxMhFQkBFSERAwL99zRbRCgoRFs0Agk0W0QoKERbNDr+wP6BAX8BQAPCKERbNP33NFtEKChEWzQCCTRbRCj9Rr4BfAF/v/6CAAL//v/CA/4DwgAYACAAAAEhIg4CFREUHgIzITI+AjURNC4CIwkBMxEhETMBAwL99zRbRCgoRFs0Agk0W0QoKERbNP74/oG/AX6+/oQDwihEWzT99zRbRCgoRFs0Agk0W0Qo/H8BfwFA/sD+gQAAAAAEAAD/wgQAA8IAGABDAG4AmQAAASEiDgIVERQeAjMhMj4CNRE0LgIjASIuAjU0PgIzMh4CFwcuAiIjIg4CFRQeAjMyPgI3Mw4DIxMUHgIXBy4DNTQ+AjMyHgIVFA4CByc+AzU0LgIjIg4CFQEiLgInMx4DMzI+AjU0LgIjKgEOAQcnPgMzMh4CFRQOAiMDBf33NFtEKChEWzQCCTRbRCgoRFs0/jElQjEcHDFCJQoUExIJNwMFBQYDDxoUCwsUGg8NGBMNAm0CHjA/JIEDBQcFNxEbEwocMUIlJUIxHAoTGxE3BQcFAwsUGg8PGhQLAQ4kPzAeAm0CDRMYDQ8aFAsLFBoPAgUFBQI3CBITEwolQjEcHDFCJQPCKERbNP33NFtEKChEWzQCCTRbRCj8wxwxQiUlQjEcAgQGBF8BAQELFBoPDxoUCwkQFg0jPS0aAggHDg0LBV8MICUqFiVCMRwcMUIlFiolIAxfBQsNDgcPGhQLCxQaD/34Gi09Iw0WEAkLFBoPDxoUCwEBAV8EBgQCHDFCJSVCMRwAAAAAAwAo/8AD3wN1ABIAFwAeAAAlAS4BDgEHAQ4BHgEzITI+ASYnBSM1MxUTByMnNTMVA9/+sBZNUkgR/qccAi1YPgJsPlgtARz+gbm5AiJ7Ib7EArAnJAImIv1ONV5GKSlHXzZ/vr4B+/39wMAAAwA+AEYDvgNCAAMACQAPAAATJQ0BFSUHBSUnASUHBSUnPgHCAb7+Qv7XmQHCAb6X/tr+15kBwgG+lwKGu7u+Qn1Avr5A/sN9QL6+QAAAAAADAAD/wgQAA8IAFAAtAHkAAAEiDgIVFB4CMzI+AjU0LgIjEyEiDgIVERQeAjMhMj4CNRE0LgIjExYOAiMiLgInFj4CNy4DJx4BPgE3LgM3HgMzLgI2Nx4DFyY+AjMyHgIXPgM3DgMHNhYyNjcOAwcCsQkQDAcHDBAJCRAMBwcMEAlU/fc0W0QoKERbNAIJNFtEKChEWzQsBDt4snMjQ0A8GyFBPjoaGzEoHggKExMSCR4xIxMBCBITFAobIw0JEB5LVmAzCRItQygSIh8bCw4oKSYMBRshIw0NISIgCwgbHx8MAqIHDBEJCRAMBwcMEAkJEQwHASEoRFs0/fc0W0QoKERbNAIJNFtEKP52V6qHUwoTGxIEBREdFAERHikZAgEBAwIGHyw2HQUHBQMSNDs+HCU9LRoDJ0k4IgcOEwwDFBkZBw4qKSMIAQECBQwTEQ8JAAAABP/+/8AD/gPAABgAQACcALEAAAEhIg4CFREUHgIzITI+AjURNC4CIwEOASoBKwEqAS4BJy4BPgE9ATQmPgE3PgEyFjsBMjYeARcTDgMHJR4BDgEHHgEOAQcOAiYjIg4BIicuAycDPgM3PgM3PgM3PgM3NiY0Njc+AxceAxcWDgIHDgMHDgMHFjYeARcWDgIHHgEUBgcFIg4CFRQeAjMyPgI1NC4CIwMC/fc0W0QoKERbNAIJNFtEKChEWzT+fAQMDxAIcw0ZFA4DAgEBAQIDCgwECw0NBjARIR0XByIBAwQFAwHbDQgGEQwHBgEHBRFAT1YnCRIRDwYGCgkJBCMCBAQDAQgREhQLBgwNDgcJFBINAQEBAQICCg4QCAkPDAgBAQEEBwUFCgoIAwMEAwIBHkdDNgwHAQoRCRAQEA/9qQoRDQcHDREKChENBwcNEQoDwChEWzT99zRbRCgoRFs0Agk0W0Qo/LsCAgQKCQgXGRgJtBAkHxcEAQEBAgIHCP6TAwYFBAHRCB8gGwQGEhQSBhQRBAMBAQEBBAUGAwF5BAgHBgINGRgWCQUIBwgFBhUaHA0FDg4NBQQKBwMCAxAVGAsLFxYTCAgMCwoGBgsMDgkCAgQRFAseHRcEBh8jIAY6CA0SCgoRDQgIDREKChINCAAAAAAE//7/wAP+A8AAGABAAJwAsQAAFyEyPgI1ETQuAiMhIg4CFREUHgIzAT4BOgE7AToBHgEXHgEOAR0BFBYOAQcOASImKwEiBi4BJwM+AzcFLgE+ATcuAT4BNz4CFjMyPgEyFx4DFxMOAwcOAwcOAwcOAwcGFhQGBw4DJy4DJyY+Ajc+Azc+AzcmBi4BJyY+AjcuATQ2NwUyPgI1NC4CIyIOAhUUHgIz+QIJNFtEKChEWzT99zRbRCgoRFs0AYQEDA8QCHMNGRQOAwIBAQECAwoMBAsNDQYwESEdFwciAQMEBQP+JQ0IBhEMBwYBBwURQE9WJwkSEQ8GBgoJCQQjAgQEAwEIERIUCwYMDQ4HCRQSDQEBAQECAgoOEAgJDwwIAQEBBAcFBQoKCAMDBAMCAR5HQzYMBwEKEQkQEBAPAlcKEQ0HBw0RCgoRDQcHDREKQChEWzQCCTRbRCgoRFs0/fc0W0QoA0UCAgQKCQgXGRgJtBAkHxcEAQEBAgIHCAFtAwYFBAHRCB8gGwQGEhQSBhQRBAMBAQEBBAUGA/6HBAgHBgINGRgWCQUIBwgFBhUaHA0FDg4NBQQKBwMCAxAVGAsLFxYTCAgMCwoGBgsMDgkCAgQRFAseHRcEBh8jIAZ1CA0SCgoRDQgIDREKChINCAAABQAA/8AEAAPAAAMABwAgACkAMgAAATMnBwUzJwcBISIOAhURFB4CMyEyPgI1ETQuAiMBJyMHIxMzEyMFJyMHIxMzEyMCdn0+P/5yQCAgAh399zRbRCgoRFs0Agk0W0QoKERbNP5UHGseWIhIhFcB2ya2KGS2YbFiAaXr6zmTkwJUKERbNP33NFtEKChEWzQCCTRbRCj9BWBgAaf+WQGBgQI5/ccAAAAAAwAC/9QD/wO9AAoBaQLJAAABNyMnByMXBzcXJwMiLgInNjQuAScuAycOAhYXHgMXLgMnPgM3Ni4CJw4DBw4BHgEXLgMnPgM3PgImJw4DBw4DFS4DNTwDNRY+Ajc+AzcuASIGBw4DBz4DNx4CNjc+AzcuAwcOAwc+AzceAzMyPgI3NC4CJyYiDgEHPgM3PgMnLgMHDgMHPgM3PgMnDgMHDgIWFw4DBz4DNz4BLgEnDgMHBh4CFw4DBy4DJy4DJw4CFhceAxccAxUUHgIXLgMnLgIiBxQeAhceAT4BNx4DFy4DJyYOAgceAxcWPgI3MC4CMR4DFyIOAgcOAwceAjY3PgM3HgMzOAMxMj4CNTQuAiMBDgMHPgM1PAM1PgM3PgEuAScOAwcOAwcuAyc+AycuAycOAhYXHgMXLgMnPgEuAScuAycGHgIXHgMXLgMnJg4CBwYeAhceAxcuAiIHDgMVHgMzMj4CNx4DFy4DJyYOAgceAxceAT4BNx4DFy4DJy4BIgYHHgMXHgM3HAMVFA4CBzQuAicuAycOAR4BFx4DFw4DBz4CJicuAycOAxceAxcOAwc+Azc+AS4BJw4DBw4CFBcOAyMiDgIVFB4CMzgDOQEyPgI3HgMXHgE+ATcuAycuAyM+AzcwDgIxHgM3PgM3LgMHDgMHPgM3HgI2Nz4DNSYiDgEHAlGBmDovmIE7gYEvcgUJCQkFAwUJBgYNDhAJBwsFAQUCBQcIBBAeHBsMCQ4LBwICAQUJBgsVEQwDAQEBAgIIDw4NBgsTEQ4FBgYCAgMLFhQRBwQGAwEFCAYDChQTEggIDQoGAgkTFBQKBQgHBgMDCQsNCAcQEhMKCxQSEQgEDBAUDAYMDAwFCRQWFwwECw8TCwwaGxwPBw4VDgcODg8HChUVFgsDBQMBAQEEBQYDCRISEQkEBwcHAwwRCQIEFSciHAoJCQMDBAwWFRQJAgQEAwEEBAIHBg8ZFA0DAgIHCwcIDQsJBAECAgMCBAsOEQoHCQMEBQUOEBIKAgQGBAMGBgcEChYWFwsHDRIMCxcXFgoIExYYDQgREhQLDhsaGAoHFBkdEBAcGRUIAQEBESUnKhYKExMTCg4aFRAFDyMkJBAQFw8IAQUJCQkFAwYEAwIEBgMBxwQHBgYDBAYEAgoSEA4FBQQDCQcKEQ4LBAIDAgIBBAkLDQgHCwcCAgMNFBkPBgcCBAQBAwQEAgkUFRYMBAMDCQkKHCInFQQCCREMAwcHBwQJERISCQMGBQQBAQEDBQMLFhUVCgcPDg4HDhUOBw8cGxoMCxMPCwQMFxYUCQULDAwGDBQQDAQIERIUCwoTEhAHCA0LCQMDBgcIBQoUFBMJAgYKDQgIEhMUCgMGCAUBAwYEBxEUFgsDAgIGBgUOERMLBg0ODwgCAgEBAQMMERULBgkFAQICBwsOCQwbHB4QBAgHBQIFAQULBwkQDg0GBgkFAwUJCQkFAwYEAgMEBgMFCQkJBQEIDxcQECQkIw8FEBUaDgoTExMKFionJREBAQEIFRkcEBAdGRQHChgaGw4LFBIRCA0YFhMIChYXFwsMEg0HCxcWFgoB416MjF6kaWmk/nsBAQIBESEgHg0NEw0HAQ4eHx8PBgsKCQQGDxETCwsZGhoNDhcTEAYIExcaDwYNDAwGChQVFgwFDhEUCwsWFRQKAQcMEQwHDxAQCA8fICERAgUFBQIBAgYKBwgRExULBQUHBwMICQoGDx4dHA0GCAMBAwMKDRAJCA0JAwIBBAUHBAwWFBMIBwoHBAQHCQUHDQsHAQEBAwIFCAcGAgEEBQYDAwUDAQECBQUGAwMFBQUDCREQDwcDCxAUCwoTEQ8GCBETFAsECQkJBQ0YFREHCRgbHQ8OFxMPBQ0cHR4PBgsLCwUNFhELAw8iISAODRMMBwEDBwcHAw8eHR0OBAcHBgMJDAYEEiIeGQgIBwEHBhEgHhwNBgoIBQECAggOChAcFQwBAQkRFw0BAQEPGhYSBwMFCAUIFBgcDwoLAggKCRkdIBABAgEBAgQFAwMGBQMBKQMGBwcEDh0dHg8DBwcHAwEHDBMNDiAhIg8DCxEWDQULCwsGDx4dHA0FDxMXDg8dGxgJBxEVGA0FCQkJBAsUExEIBg8REwoLFBALAwcPEBEJAwUFBQMDBgUFAgEBAwUDAwYFBAECBgcIBQIDAQEBBwsNBwUJBwQEBwoHCBMUFgwEBwUEAQIDCQ0ICRANCgMDAQMIBg0cHR4PBgoJCAMHBwUFCxUTEQgHCgYCAQIFBQUCESEgHw8IEBAPBwwRDAcBChQVFgsLFBEOBQwWFRQKBgwMDQYPGhcTCAYQExcODRoaGQsLExEPBgQJCgsGDx8fHg4BBw0TDQ0eICERAQIBAQMFBgMDBQQCAQECARAgHRkJCggCCwoPHBgUCAUIBQMHEhYaDwEBAQ0XEQkBAQwVHBAKDggCAgEFCAoGDRweIBEGBwEHCAgZHiISBAYMCQAAAAUAIP/BA94DvgAEABEAFgAbACAAABMzESMREyEyPgI3IR4DMxMzESMRFzMRIxETMxEjEXyFhX4CCSNBOC4Q/EIQLjhBI1aFhdWFhdWFhQH+/n4Bgv3CEiIvHBwvIhIDOv2CAn5+/gACAAFC/L4DQgAIAAD/wgQAA8IAGAAdACIAJwAsADUAOgA/AAABISIOAhURFB4CMyEyPgI1ETQuAiMNAQclNwcFByU3BwUHJTcHIRUhNQUhETMRIREzEQsBNxMHNwM3EwcDBf33NFtEKChEWzQCCTRbRCgoRFs0/nMBDSX+7ylRATMT/soVIwE/B/7ACAgBQf6/Ab79xUIBuj8us0CsOUEYTQ9EA8IoRFs0/fc0W0QoKERbNAIJNFtEKP2vOqhBmV1CVUqTJEQcTYFNTdIBX/7dASP+oQHXAQsq/vElKAFABf6/BAAAAQAAAAEAAEniMg5fDzz1AAsEAAAAAADOjwBrAAAAAM6PAGv//v/ABAID2AAAAAgAAgAAAAAAAAABAAADwP/AAAAEAP/+//4EAgABAAAAAAAAAAAAAAAAAAAAKgAAAAACAAAABAAAAAQA//4EAAAABAAAGgQA//4EAAAABAAAQgQAAAMEAAABBAAAAAQA//8EAAAABAAAeAQAAAAEAAAABAAAQgQAAEIEAAAABAD//gQAAJEEAAAABAAAAAQAACIEAP/+BAAAAAQA//4EAP/+BAD//gQA//4EAP/+BAAAAAQAACgEAAA+BAAAAAQA//4EAP/+BAAAAAQAAAIEAAAgBAAAAAAAAAAACgCmAOQB9AK0AyIDlAQaBQ4FuAaSBr4HZggyCHoJRgnSClwKqAtGC8IMpA4MDmgO/g9ED4gPvg/2ECwQZBEyEWgRkBI6EzQULBSAGCQYXBjKAAAAAQAAACoCygAOAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABABYAAAABAAAAAAACAA4AYwABAAAAAAADABYALAABAAAAAAAEABYAcQABAAAAAAAFABYAFgABAAAAAAAGAAsAQgABAAAAAAAKACgAhwADAAEECQABABYAAAADAAEECQACAA4AYwADAAEECQADABYALAADAAEECQAEABYAcQADAAEECQAFABYAFgADAAEECQAGABYATQADAAEECQAKACgAhwBwAHkAdABoAG8AbgBpAGMAbwBuAHMAVgBlAHIAcwBpAG8AbgAgADAALgAwAHAAeQB0AGgAbwBuAGkAYwBvAG4Ac3B5dGhvbmljb25zAHAAeQB0AGgAbwBuAGkAYwBvAG4AcwBSAGUAZwB1AGwAYQByAHAAeQB0AGgAbwBuAGkAYwBvAG4AcwBHAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4AAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==) format("truetype"), url(data:application/font-woff;charset=utf-8;base64,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) format("woff"); - font-weight: normal; - font-style: normal; } -.icon-megaphone:before { - content: "\e600"; } - -.icon-python-alt:before { - content: "\e601"; } - -.icon-pypi:before { - content: "\e602"; } - -.icon-news:before { - content: "\e603"; } - -.icon-moderate:before { - content: "\e604"; } - -.icon-mercurial:before { - content: "\e605"; } - -.icon-jobs:before { - content: "\e606"; } - -.icon-help:before { - content: "\3f"; } - -.icon-download:before { - content: "\e609"; } - -.icon-documentation:before { - content: "\e60a"; } - -.icon-community:before { - content: "\e60b"; } - -.icon-code:before { - content: "\e60c"; } - -.icon-close:before { - content: "\58"; } - -.icon-calendar:before { - content: "\e60e"; } - -.icon-beginner:before { - content: "\e60f"; } - -.icon-advanced:before { - content: "\e610"; } - -.icon-sitemap:before { - content: "\e611"; } - -.icon-search-alt:before { - content: "\e612"; } - -.icon-search:before { - content: "\e613"; } - -.icon-python:before { - content: "\e614"; } - -.icon-github:before { - content: "\e615"; } - -.icon-get-started:before { - content: "\e616"; } - -.icon-feed:before { - content: "\e617"; } - -.icon-facebook:before { - content: "\e618"; } - -.icon-email:before { - content: "\e619"; } - -.icon-arrow-up:before { - content: "\e61a"; } - -.icon-arrow-right:before { - content: "\e61b"; } - -.icon-arrow-left:before { - content: "\e61c"; } - -.icon-arrow-down:before, .errorlist:before { - content: "\e61d"; } - -.icon-freenode:before { - content: "\e61e"; } - -.icon-alert:before { - content: "\e61f"; } - -.icon-versions:before { - content: "\e620"; } - -.icon-twitter:before { - content: "\e621"; } - -.icon-thumbs-up:before { - content: "\e622"; } - -.icon-thumbs-down:before { - content: "\e623"; } - -.icon-text-resize:before { - content: "\e624"; } - -.icon-success-stories:before { - content: "\e625"; } - -.icon-statistics:before { - content: "\e626"; } + font-family: 'Pythonicon'; + src: url(data:application/x-font-woff;charset=utf-8;base64,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) format('woff'), + url(data:application/x-font-ttf;charset=utf-8;base64,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) format('truetype'); + font-weight: normal; + font-style: normal; +} -.icon-stack-overflow:before { - content: "\e627"; } + .icon-bullhorn:before { + content: "\e600"; + } + .icon-python-alt:before { + content: "\e601"; + } + .icon-pypi:before { + content: "\e602"; + } + .icon-news:before { + content: "\e603"; + } + .icon-moderate:before { + content: "\e604"; + } + .icon-mercurial:before { + content: "\e605"; + } + .icon-jobs:before { + content: "\e606"; + } + .icon-help:before { + content: "\3f"; + } + .icon-download:before { + content: "\e609"; + } + .icon-documentation:before { + content: "\e60a"; + } + .icon-community:before { + content: "\e60b"; + } + .icon-code:before { + content: "\e60c"; + } + .icon-close:before { + content: "\58"; + } + .icon-calendar:before { + content: "\e60e"; + } + .icon-beginner:before { + content: "\e60f"; + } + .icon-advanced:before { + content: "\e610"; + } + .icon-sitemap:before { + content: "\e611"; + } + .icon-search-alt:before { + content: "\e612"; + } + .icon-search:before { + content: "\e613"; + } + .icon-python:before { + content: "\e614"; + } + .icon-github:before { + content: "\e615"; + } + .icon-get-started:before { + content: "\e616"; + } + .icon-feed:before { + content: "\e617"; + } + .icon-facebook:before { + content: "\e618"; + } + .icon-email:before { + content: "\e619"; + } + .icon-arrow-up:before { + content: "\e61a"; + } + .icon-arrow-right:before { + content: "\e61b"; + } + .icon-arrow-left:before { + content: "\e61c"; + } + .icon-arrow-down:before, .errorlist:before { + content: "\e61d"; + } + .icon-freenode:before { + content: "\e61e"; + } + .icon-alert:before { + content: "\e61f"; + } + .icon-versions:before { + content: "\e620"; + } + .icon-twitter:before { + content: "\e621"; + } + .icon-thumbs-up:before { + content: "\e622"; + } + .icon-thumbs-down:before { + content: "\e623"; + } + .icon-text-resize:before { + content: "\e624"; + } + .icon-success-stories:before { + content: "\e625"; + } + .icon-statistics:before { + content: "\e626"; + } + .icon-stack-overflow:before { + content: "\e627"; + } + .icon-mastodon:before { + content: "\e900"; + } /* * Hide from anything that does not support FontFace (Opera Mini, Blackberry) @@ -3546,18 +3554,18 @@ span.highlighted { * or generated content */ /*modernizr*/ -.no-fontface .icon-megaphone, .no-fontface .icon-python-alt, .no-fontface .icon-pypi, .no-fontface .icon-news, .no-fontface .icon-moderate, .no-fontface .icon-mercurial, .no-fontface .icon-jobs, .no-fontface .icon-help, .no-fontface .icon-download, .no-fontface .icon-documentation, .no-fontface .icon-community, .no-fontface .icon-code, .no-fontface .icon-close, .no-fontface .icon-calendar, .no-fontface .icon-beginner, .no-fontface .icon-advanced, .no-fontface .icon-sitemap, .no-fontface .icon-search, .no-fontface .icon-search-alt, .no-fontface .icon-python, .no-fontface .icon-github, .no-fontface .icon-get-started, .no-fontface .icon-feed, .no-fontface .icon-facebook, .no-fontface .icon-email, .no-fontface .icon-arrow-up, .no-fontface .icon-arrow-right, .no-fontface .icon-arrow-left, .no-fontface .icon-arrow-down, .no-fontface .errorlist:before, .no-fontface .icon-freenode, .no-fontface .icon-alert, .no-fontface .icon-versions, .no-fontface .icon-twitter, .no-fontface .icon-thumbs-up, .no-fontface .icon-thumbs-down, .no-fontface .icon-text-resize, .no-fontface .icon-success-stories, .no-fontface .icon-statistics, .no-fontface .icon-stack-overflow, .no-svg .icon-megaphone, .no-svg .icon-python-alt, .no-svg .icon-pypi, .no-svg .icon-news, .no-svg .icon-moderate, .no-svg .icon-mercurial, .no-svg .icon-jobs, .no-svg .icon-help, .no-svg .icon-download, .no-svg .icon-documentation, .no-svg .icon-community, .no-svg .icon-code, .no-svg .icon-close, .no-svg .icon-calendar, .no-svg .icon-beginner, .no-svg .icon-advanced, .no-svg .icon-sitemap, .no-svg .icon-search, .no-svg .icon-search-alt, .no-svg .icon-python, .no-svg .icon-github, .no-svg .icon-get-started, .no-svg .icon-feed, .no-svg .icon-facebook, .no-svg .icon-email, .no-svg .icon-arrow-up, .no-svg .icon-arrow-right, .no-svg .icon-arrow-left, .no-svg .icon-arrow-down, .no-svg .errorlist:before, .no-svg .icon-freenode, .no-svg .icon-alert, .no-svg .icon-versions, .no-svg .icon-twitter, .no-svg .icon-thumbs-up, .no-svg .icon-thumbs-down, .no-svg .icon-text-resize, .no-svg .icon-success-stories, .no-svg .icon-statistics, .no-svg .icon-stack-overflow, .no-generatedcontent .icon-megaphone, .no-generatedcontent .icon-python-alt, .no-generatedcontent .icon-pypi, .no-generatedcontent .icon-news, .no-generatedcontent .icon-moderate, .no-generatedcontent .icon-mercurial, .no-generatedcontent .icon-jobs, .no-generatedcontent .icon-help, .no-generatedcontent .icon-download, .no-generatedcontent .icon-documentation, .no-generatedcontent .icon-community, .no-generatedcontent .icon-code, .no-generatedcontent .icon-close, .no-generatedcontent .icon-calendar, .no-generatedcontent .icon-beginner, .no-generatedcontent .icon-advanced, .no-generatedcontent .icon-sitemap, .no-generatedcontent .icon-search, .no-generatedcontent .icon-search-alt, .no-generatedcontent .icon-python, .no-generatedcontent .icon-github, .no-generatedcontent .icon-get-started, .no-generatedcontent .icon-feed, .no-generatedcontent .icon-facebook, .no-generatedcontent .icon-email, .no-generatedcontent .icon-arrow-up, .no-generatedcontent .icon-arrow-right, .no-generatedcontent .icon-arrow-left, .no-generatedcontent .icon-arrow-down, .no-generatedcontent .errorlist:before, .no-generatedcontent .icon-freenode, .no-generatedcontent .icon-alert, .no-generatedcontent .icon-versions, .no-generatedcontent .icon-twitter, .no-generatedcontent .icon-thumbs-up, .no-generatedcontent .icon-thumbs-down, .no-generatedcontent .icon-text-resize, .no-generatedcontent .icon-success-stories, .no-generatedcontent .icon-statistics, .no-generatedcontent .icon-stack-overflow { +.no-fontface .icon-megaphone, .no-fontface .icon-python-alt, .no-fontface .icon-pypi, .no-fontface .icon-news, .no-fontface .icon-moderate, .no-fontface .icon-mercurial, .no-fontface .icon-jobs, .no-fontface .icon-help, .no-fontface .icon-download, .no-fontface .icon-documentation, .no-fontface .icon-community, .no-fontface .icon-code, .no-fontface .icon-close, .no-fontface .icon-calendar, .no-fontface .icon-beginner, .no-fontface .icon-advanced, .no-fontface .icon-sitemap, .no-fontface .icon-search, .no-fontface .icon-search-alt, .no-fontface .icon-python, .no-fontface .icon-github, .no-fontface .icon-get-started, .no-fontface .icon-feed, .no-fontface .icon-facebook, .no-fontface .icon-email, .no-fontface .icon-arrow-up, .no-fontface .icon-arrow-right, .no-fontface .icon-arrow-left, .no-fontface .icon-arrow-down, .no-fontface .errorlist:before, .no-fontface .icon-freenode, .no-fontface .icon-alert, .no-fontface .icon-versions, .no-fontface .icon-twitter, .no-fontface .icon-thumbs-up, .no-fontface .icon-thumbs-down, .no-fontface .icon-text-resize, .no-fontface .icon-success-stories, .no-fontface .icon-statistics, .no-fontface .icon-stack-overflow, .no-fontface .icon-mastodon, .no-svg .icon-megaphone, .no-svg .icon-python-alt, .no-svg .icon-pypi, .no-svg .icon-news, .no-svg .icon-moderate, .no-svg .icon-mercurial, .no-svg .icon-jobs, .no-svg .icon-help, .no-svg .icon-download, .no-svg .icon-documentation, .no-svg .icon-community, .no-svg .icon-code, .no-svg .icon-close, .no-svg .icon-calendar, .no-svg .icon-beginner, .no-svg .icon-advanced, .no-svg .icon-sitemap, .no-svg .icon-search, .no-svg .icon-search-alt, .no-svg .icon-python, .no-svg .icon-github, .no-svg .icon-get-started, .no-svg .icon-feed, .no-svg .icon-facebook, .no-svg .icon-email, .no-svg .icon-arrow-up, .no-svg .icon-arrow-right, .no-svg .icon-arrow-left, .no-svg .icon-arrow-down, .no-svg .errorlist:before, .no-svg .icon-freenode, .no-svg .icon-alert, .no-svg .icon-versions, .no-svg .icon-twitter, .no-svg .icon-thumbs-up, .no-svg .icon-thumbs-down, .no-svg .icon-text-resize, .no-svg .icon-success-stories, .no-svg .icon-statistics, .no-svg .icon-stack-overflow, .no-svg .icon-mastodon, .no-generatedcontent .icon-megaphone, .no-generatedcontent .icon-python-alt, .no-generatedcontent .icon-pypi, .no-generatedcontent .icon-news, .no-generatedcontent .icon-moderate, .no-generatedcontent .icon-mercurial, .no-generatedcontent .icon-jobs, .no-generatedcontent .icon-help, .no-generatedcontent .icon-download, .no-generatedcontent .icon-documentation, .no-generatedcontent .icon-community, .no-generatedcontent .icon-code, .no-generatedcontent .icon-close, .no-generatedcontent .icon-calendar, .no-generatedcontent .icon-beginner, .no-generatedcontent .icon-advanced, .no-generatedcontent .icon-sitemap, .no-generatedcontent .icon-search, .no-generatedcontent .icon-search-alt, .no-generatedcontent .icon-python, .no-generatedcontent .icon-github, .no-generatedcontent .icon-get-started, .no-generatedcontent .icon-feed, .no-generatedcontent .icon-facebook, .no-generatedcontent .icon-email, .no-generatedcontent .icon-arrow-up, .no-generatedcontent .icon-arrow-right, .no-generatedcontent .icon-arrow-left, .no-generatedcontent .icon-arrow-down, .no-generatedcontent .errorlist:before, .no-generatedcontent .icon-freenode, .no-generatedcontent .icon-alert, .no-generatedcontent .icon-versions, .no-generatedcontent .icon-twitter, .no-generatedcontent .icon-thumbs-up, .no-generatedcontent .icon-thumbs-down, .no-generatedcontent .icon-text-resize, .no-generatedcontent .icon-success-stories, .no-generatedcontent .icon-statistics, .no-generatedcontent .icon-stack-overflow, .no-generatedcontent .icon-mastodon { /* Show a unicode character back up if it exists */ } - .no-fontface .icon-megaphone:before, .no-fontface .icon-python-alt:before, .no-fontface .icon-pypi:before, .no-fontface .icon-news:before, .no-fontface .icon-moderate:before, .no-fontface .icon-mercurial:before, .no-fontface .icon-jobs:before, .no-fontface .icon-help:before, .no-fontface .icon-download:before, .no-fontface .icon-documentation:before, .no-fontface .icon-community:before, .no-fontface .icon-code:before, .no-fontface .icon-close:before, .no-fontface .icon-calendar:before, .no-fontface .icon-beginner:before, .no-fontface .icon-advanced:before, .no-fontface .icon-sitemap:before, .no-fontface .icon-search:before, .no-fontface .icon-search-alt:before, .no-fontface .icon-python:before, .no-fontface .icon-github:before, .no-fontface .icon-get-started:before, .no-fontface .icon-feed:before, .no-fontface .icon-facebook:before, .no-fontface .icon-email:before, .no-fontface .icon-arrow-up:before, .no-fontface .icon-arrow-right:before, .no-fontface .icon-arrow-left:before, .no-fontface .icon-arrow-down:before, .no-fontface .errorlist:before, .no-fontface .icon-freenode:before, .no-fontface .icon-alert:before, .no-fontface .icon-versions:before, .no-fontface .icon-twitter:before, .no-fontface .icon-thumbs-up:before, .no-fontface .icon-thumbs-down:before, .no-fontface .icon-text-resize:before, .no-fontface .icon-success-stories:before, .no-fontface .icon-statistics:before, .no-fontface .icon-stack-overflow:before, .no-svg .icon-megaphone:before, .no-svg .icon-python-alt:before, .no-svg .icon-pypi:before, .no-svg .icon-news:before, .no-svg .icon-moderate:before, .no-svg .icon-mercurial:before, .no-svg .icon-jobs:before, .no-svg .icon-help:before, .no-svg .icon-download:before, .no-svg .icon-documentation:before, .no-svg .icon-community:before, .no-svg .icon-code:before, .no-svg .icon-close:before, .no-svg .icon-calendar:before, .no-svg .icon-beginner:before, .no-svg .icon-advanced:before, .no-svg .icon-sitemap:before, .no-svg .icon-search:before, .no-svg .icon-search-alt:before, .no-svg .icon-python:before, .no-svg .icon-github:before, .no-svg .icon-get-started:before, .no-svg .icon-feed:before, .no-svg .icon-facebook:before, .no-svg .icon-email:before, .no-svg .icon-arrow-up:before, .no-svg .icon-arrow-right:before, .no-svg .icon-arrow-left:before, .no-svg .icon-arrow-down:before, .no-svg .errorlist:before, .no-svg .icon-freenode:before, .no-svg .icon-alert:before, .no-svg .icon-versions:before, .no-svg .icon-twitter:before, .no-svg .icon-thumbs-up:before, .no-svg .icon-thumbs-down:before, .no-svg .icon-text-resize:before, .no-svg .icon-success-stories:before, .no-svg .icon-statistics:before, .no-svg .icon-stack-overflow:before, .no-generatedcontent .icon-megaphone:before, .no-generatedcontent .icon-python-alt:before, .no-generatedcontent .icon-pypi:before, .no-generatedcontent .icon-news:before, .no-generatedcontent .icon-moderate:before, .no-generatedcontent .icon-mercurial:before, .no-generatedcontent .icon-jobs:before, .no-generatedcontent .icon-help:before, .no-generatedcontent .icon-download:before, .no-generatedcontent .icon-documentation:before, .no-generatedcontent .icon-community:before, .no-generatedcontent .icon-code:before, .no-generatedcontent .icon-close:before, .no-generatedcontent .icon-calendar:before, .no-generatedcontent .icon-beginner:before, .no-generatedcontent .icon-advanced:before, .no-generatedcontent .icon-sitemap:before, .no-generatedcontent .icon-search:before, .no-generatedcontent .icon-search-alt:before, .no-generatedcontent .icon-python:before, .no-generatedcontent .icon-github:before, .no-generatedcontent .icon-get-started:before, .no-generatedcontent .icon-feed:before, .no-generatedcontent .icon-facebook:before, .no-generatedcontent .icon-email:before, .no-generatedcontent .icon-arrow-up:before, .no-generatedcontent .icon-arrow-right:before, .no-generatedcontent .icon-arrow-left:before, .no-generatedcontent .icon-arrow-down:before, .no-generatedcontent .errorlist:before, .no-generatedcontent .icon-freenode:before, .no-generatedcontent .icon-alert:before, .no-generatedcontent .icon-versions:before, .no-generatedcontent .icon-twitter:before, .no-generatedcontent .icon-thumbs-up:before, .no-generatedcontent .icon-thumbs-down:before, .no-generatedcontent .icon-text-resize:before, .no-generatedcontent .icon-success-stories:before, .no-generatedcontent .icon-statistics:before, .no-generatedcontent .icon-stack-overflow:before { + .no-fontface .icon-megaphone:before, .no-fontface .icon-python-alt:before, .no-fontface .icon-pypi:before, .no-fontface .icon-news:before, .no-fontface .icon-moderate:before, .no-fontface .icon-mercurial:before, .no-fontface .icon-jobs:before, .no-fontface .icon-help:before, .no-fontface .icon-download:before, .no-fontface .icon-documentation:before, .no-fontface .icon-community:before, .no-fontface .icon-code:before, .no-fontface .icon-close:before, .no-fontface .icon-calendar:before, .no-fontface .icon-beginner:before, .no-fontface .icon-advanced:before, .no-fontface .icon-sitemap:before, .no-fontface .icon-search:before, .no-fontface .icon-search-alt:before, .no-fontface .icon-python:before, .no-fontface .icon-github:before, .no-fontface .icon-get-started:before, .no-fontface .icon-feed:before, .no-fontface .icon-facebook:before, .no-fontface .icon-email:before, .no-fontface .icon-arrow-up:before, .no-fontface .icon-arrow-right:before, .no-fontface .icon-arrow-left:before, .no-fontface .icon-arrow-down:before, .no-fontface .errorlist:before, .no-fontface .icon-freenode:before, .no-fontface .icon-alert:before, .no-fontface .icon-versions:before, .no-fontface .icon-twitter:before, .no-fontface .icon-thumbs-up:before, .no-fontface .icon-thumbs-down:before, .no-fontface .icon-text-resize:before, .no-fontface .icon-success-stories:before, .no-fontface .icon-statistics:before, .no-fontface .icon-stack-overflow:before, .no-fontface .icon-mastodon:before, .no-svg .icon-megaphone:before, .no-svg .icon-python-alt:before, .no-svg .icon-pypi:before, .no-svg .icon-news:before, .no-svg .icon-moderate:before, .no-svg .icon-mercurial:before, .no-svg .icon-jobs:before, .no-svg .icon-help:before, .no-svg .icon-download:before, .no-svg .icon-documentation:before, .no-svg .icon-community:before, .no-svg .icon-code:before, .no-svg .icon-close:before, .no-svg .icon-calendar:before, .no-svg .icon-beginner:before, .no-svg .icon-advanced:before, .no-svg .icon-sitemap:before, .no-svg .icon-search:before, .no-svg .icon-search-alt:before, .no-svg .icon-python:before, .no-svg .icon-github:before, .no-svg .icon-get-started:before, .no-svg .icon-feed:before, .no-svg .icon-facebook:before, .no-svg .icon-email:before, .no-svg .icon-arrow-up:before, .no-svg .icon-arrow-right:before, .no-svg .icon-arrow-left:before, .no-svg .icon-arrow-down:before, .no-svg .errorlist:before, .no-svg .icon-freenode:before, .no-svg .icon-alert:before, .no-svg .icon-versions:before, .no-svg .icon-twitter:before, .no-svg .icon-thumbs-up:before, .no-svg .icon-thumbs-down:before, .no-svg .icon-text-resize:before, .no-svg .icon-success-stories:before, .no-svg .icon-statistics:before, .no-svg .icon-stack-overflow:before, .no-svg .icon-mastodon:before, .no-generatedcontent .icon-megaphone:before, .no-generatedcontent .icon-python-alt:before, .no-generatedcontent .icon-pypi:before, .no-generatedcontent .icon-news:before, .no-generatedcontent .icon-moderate:before, .no-generatedcontent .icon-mercurial:before, .no-generatedcontent .icon-jobs:before, .no-generatedcontent .icon-help:before, .no-generatedcontent .icon-download:before, .no-generatedcontent .icon-documentation:before, .no-generatedcontent .icon-community:before, .no-generatedcontent .icon-code:before, .no-generatedcontent .icon-close:before, .no-generatedcontent .icon-calendar:before, .no-generatedcontent .icon-beginner:before, .no-generatedcontent .icon-advanced:before, .no-generatedcontent .icon-sitemap:before, .no-generatedcontent .icon-search:before, .no-generatedcontent .icon-search-alt:before, .no-generatedcontent .icon-python:before, .no-generatedcontent .icon-github:before, .no-generatedcontent .icon-get-started:before, .no-generatedcontent .icon-feed:before, .no-generatedcontent .icon-facebook:before, .no-generatedcontent .icon-email:before, .no-generatedcontent .icon-arrow-up:before, .no-generatedcontent .icon-arrow-right:before, .no-generatedcontent .icon-arrow-left:before, .no-generatedcontent .icon-arrow-down:before, .no-generatedcontent .errorlist:before, .no-generatedcontent .icon-freenode:before, .no-generatedcontent .icon-alert:before, .no-generatedcontent .icon-versions:before, .no-generatedcontent .icon-twitter:before, .no-generatedcontent .icon-thumbs-up:before, .no-generatedcontent .icon-thumbs-down:before, .no-generatedcontent .icon-text-resize:before, .no-generatedcontent .icon-success-stories:before, .no-generatedcontent .icon-statistics:before, .no-generatedcontent .icon-stack-overflow:before, .no-generatedcontent .icon-mastodon:before { display: none; margin-right: 0; } - .no-fontface .icon-megaphone span, .no-fontface .icon-python-alt span, .no-fontface .icon-pypi span, .no-fontface .icon-news span, .no-fontface .icon-moderate span, .no-fontface .icon-mercurial span, .no-fontface .icon-jobs span, .no-fontface .icon-help span, .no-fontface .icon-download span, .no-fontface .icon-documentation span, .no-fontface .icon-community span, .no-fontface .icon-code span, .no-fontface .icon-close span, .no-fontface .icon-calendar span, .no-fontface .icon-beginner span, .no-fontface .icon-advanced span, .no-fontface .icon-sitemap span, .no-fontface .icon-search span, .no-fontface .icon-search-alt span, .no-fontface .icon-python span, .no-fontface .icon-github span, .no-fontface .icon-get-started span, .no-fontface .icon-feed span, .no-fontface .icon-facebook span, .no-fontface .icon-email span, .no-fontface .icon-arrow-up span, .no-fontface .icon-arrow-right span, .no-fontface .icon-arrow-left span, .no-fontface .icon-arrow-down span, .no-fontface .errorlist:before span, .no-fontface .icon-freenode span, .no-fontface .icon-alert span, .no-fontface .icon-versions span, .no-fontface .icon-twitter span, .no-fontface .icon-thumbs-up span, .no-fontface .icon-thumbs-down span, .no-fontface .icon-text-resize span, .no-fontface .icon-success-stories span, .no-fontface .icon-statistics span, .no-fontface .icon-stack-overflow span, .no-svg .icon-megaphone span, .no-svg .icon-python-alt span, .no-svg .icon-pypi span, .no-svg .icon-news span, .no-svg .icon-moderate span, .no-svg .icon-mercurial span, .no-svg .icon-jobs span, .no-svg .icon-help span, .no-svg .icon-download span, .no-svg .icon-documentation span, .no-svg .icon-community span, .no-svg .icon-code span, .no-svg .icon-close span, .no-svg .icon-calendar span, .no-svg .icon-beginner span, .no-svg .icon-advanced span, .no-svg .icon-sitemap span, .no-svg .icon-search span, .no-svg .icon-search-alt span, .no-svg .icon-python span, .no-svg .icon-github span, .no-svg .icon-get-started span, .no-svg .icon-feed span, .no-svg .icon-facebook span, .no-svg .icon-email span, .no-svg .icon-arrow-up span, .no-svg .icon-arrow-right span, .no-svg .icon-arrow-left span, .no-svg .icon-arrow-down span, .no-svg .errorlist:before span, .no-svg .icon-freenode span, .no-svg .icon-alert span, .no-svg .icon-versions span, .no-svg .icon-twitter span, .no-svg .icon-thumbs-up span, .no-svg .icon-thumbs-down span, .no-svg .icon-text-resize span, .no-svg .icon-success-stories span, .no-svg .icon-statistics span, .no-svg .icon-stack-overflow span, .no-generatedcontent .icon-megaphone span, .no-generatedcontent .icon-python-alt span, .no-generatedcontent .icon-pypi span, .no-generatedcontent .icon-news span, .no-generatedcontent .icon-moderate span, .no-generatedcontent .icon-mercurial span, .no-generatedcontent .icon-jobs span, .no-generatedcontent .icon-help span, .no-generatedcontent .icon-download span, .no-generatedcontent .icon-documentation span, .no-generatedcontent .icon-community span, .no-generatedcontent .icon-code span, .no-generatedcontent .icon-close span, .no-generatedcontent .icon-calendar span, .no-generatedcontent .icon-beginner span, .no-generatedcontent .icon-advanced span, .no-generatedcontent .icon-sitemap span, .no-generatedcontent .icon-search span, .no-generatedcontent .icon-search-alt span, .no-generatedcontent .icon-python span, .no-generatedcontent .icon-github span, .no-generatedcontent .icon-get-started span, .no-generatedcontent .icon-feed span, .no-generatedcontent .icon-facebook span, .no-generatedcontent .icon-email span, .no-generatedcontent .icon-arrow-up span, .no-generatedcontent .icon-arrow-right span, .no-generatedcontent .icon-arrow-left span, .no-generatedcontent .icon-arrow-down span, .no-generatedcontent .errorlist:before span, .no-generatedcontent .icon-freenode span, .no-generatedcontent .icon-alert span, .no-generatedcontent .icon-versions span, .no-generatedcontent .icon-twitter span, .no-generatedcontent .icon-thumbs-up span, .no-generatedcontent .icon-thumbs-down span, .no-generatedcontent .icon-text-resize span, .no-generatedcontent .icon-success-stories span, .no-generatedcontent .icon-statistics span, .no-generatedcontent .icon-stack-overflow span { + .no-fontface .icon-megaphone span, .no-fontface .icon-python-alt span, .no-fontface .icon-pypi span, .no-fontface .icon-news span, .no-fontface .icon-moderate span, .no-fontface .icon-mercurial span, .no-fontface .icon-jobs span, .no-fontface .icon-help span, .no-fontface .icon-download span, .no-fontface .icon-documentation span, .no-fontface .icon-community span, .no-fontface .icon-code span, .no-fontface .icon-close span, .no-fontface .icon-calendar span, .no-fontface .icon-beginner span, .no-fontface .icon-advanced span, .no-fontface .icon-sitemap span, .no-fontface .icon-search span, .no-fontface .icon-search-alt span, .no-fontface .icon-python span, .no-fontface .icon-github span, .no-fontface .icon-get-started span, .no-fontface .icon-feed span, .no-fontface .icon-facebook span, .no-fontface .icon-email span, .no-fontface .icon-arrow-up span, .no-fontface .icon-arrow-right span, .no-fontface .icon-arrow-left span, .no-fontface .icon-arrow-down span, .no-fontface .errorlist:before span, .no-fontface .icon-freenode span, .no-fontface .icon-alert span, .no-fontface .icon-versions span, .no-fontface .icon-twitter span, .no-fontface .icon-thumbs-up span, .no-fontface .icon-thumbs-down span, .no-fontface .icon-text-resize span, .no-fontface .icon-success-stories span, .no-fontface .icon-statistics span, .no-fontface .icon-stack-overflow span, .no-fontface .icon-mastodon span, .no-svg .icon-megaphone span, .no-svg .icon-python-alt span, .no-svg .icon-pypi span, .no-svg .icon-news span, .no-svg .icon-moderate span, .no-svg .icon-mercurial span, .no-svg .icon-jobs span, .no-svg .icon-help span, .no-svg .icon-download span, .no-svg .icon-documentation span, .no-svg .icon-community span, .no-svg .icon-code span, .no-svg .icon-close span, .no-svg .icon-calendar span, .no-svg .icon-beginner span, .no-svg .icon-advanced span, .no-svg .icon-sitemap span, .no-svg .icon-search span, .no-svg .icon-search-alt span, .no-svg .icon-python span, .no-svg .icon-github span, .no-svg .icon-get-started span, .no-svg .icon-feed span, .no-svg .icon-facebook span, .no-svg .icon-email span, .no-svg .icon-arrow-up span, .no-svg .icon-arrow-right span, .no-svg .icon-arrow-left span, .no-svg .icon-arrow-down span, .no-svg .errorlist:before span, .no-svg .icon-freenode span, .no-svg .icon-alert span, .no-svg .icon-versions span, .no-svg .icon-twitter span, .no-svg .icon-thumbs-up span, .no-svg .icon-thumbs-down span, .no-svg .icon-text-resize span, .no-svg .icon-success-stories span, .no-svg .icon-statistics span, .no-svg .icon-stack-overflow span, .no-svg .icon-mastodon span, .no-generatedcontent .icon-megaphone span, .no-generatedcontent .icon-python-alt span, .no-generatedcontent .icon-pypi span, .no-generatedcontent .icon-news span, .no-generatedcontent .icon-moderate span, .no-generatedcontent .icon-mercurial span, .no-generatedcontent .icon-jobs span, .no-generatedcontent .icon-help span, .no-generatedcontent .icon-download span, .no-generatedcontent .icon-documentation span, .no-generatedcontent .icon-community span, .no-generatedcontent .icon-code span, .no-generatedcontent .icon-close span, .no-generatedcontent .icon-calendar span, .no-generatedcontent .icon-beginner span, .no-generatedcontent .icon-advanced span, .no-generatedcontent .icon-sitemap span, .no-generatedcontent .icon-search span, .no-generatedcontent .icon-search-alt span, .no-generatedcontent .icon-python span, .no-generatedcontent .icon-github span, .no-generatedcontent .icon-get-started span, .no-generatedcontent .icon-feed span, .no-generatedcontent .icon-facebook span, .no-generatedcontent .icon-email span, .no-generatedcontent .icon-arrow-up span, .no-generatedcontent .icon-arrow-right span, .no-generatedcontent .icon-arrow-left span, .no-generatedcontent .icon-arrow-down span, .no-generatedcontent .errorlist:before span, .no-generatedcontent .icon-freenode span, .no-generatedcontent .icon-alert span, .no-generatedcontent .icon-versions span, .no-generatedcontent .icon-twitter span, .no-generatedcontent .icon-thumbs-up span, .no-generatedcontent .icon-thumbs-down span, .no-generatedcontent .icon-text-resize span, .no-generatedcontent .icon-success-stories span, .no-generatedcontent .icon-statistics span, .no-generatedcontent .icon-stack-overflow span, .no-generatedcontent .icon-mastodon span { display: inline; } /* Show in IE8: supports FontFace (eot) but not SVG. */ -.ie8 .icon-megaphone:before, .ie8 .icon-python-alt:before, .ie8 .icon-pypi:before, .ie8 .icon-news:before, .ie8 .icon-moderate:before, .ie8 .icon-mercurial:before, .ie8 .icon-jobs:before, .ie8 .icon-help:before, .ie8 .icon-download:before, .ie8 .icon-documentation:before, .ie8 .icon-community:before, .ie8 .icon-code:before, .ie8 .icon-close:before, .ie8 .icon-calendar:before, .ie8 .icon-beginner:before, .ie8 .icon-advanced:before, .ie8 .icon-sitemap:before, .ie8 .icon-search:before, .ie8 .icon-search-alt:before, .ie8 .icon-python:before, .ie8 .icon-github:before, .ie8 .icon-get-started:before, .ie8 .icon-feed:before, .ie8 .icon-facebook:before, .ie8 .icon-email:before, .ie8 .icon-arrow-up:before, .ie8 .icon-arrow-right:before, .ie8 .icon-arrow-left:before, .ie8 .icon-arrow-down:before, .ie8 .errorlist:before, .ie8 .icon-freenode:before, .ie8 .icon-alert:before, .ie8 .icon-versions:before, .ie8 .icon-twitter:before, .ie8 .icon-thumbs-up:before, .ie8 .icon-thumbs-down:before, .ie8 .icon-text-resize:before, .ie8 .icon-success-stories:before, .ie8 .icon-statistics:before, .ie8 .icon-stack-overflow:before { +.ie8 .icon-megaphone:before, .ie8 .icon-python-alt:before, .ie8 .icon-pypi:before, .ie8 .icon-news:before, .ie8 .icon-moderate:before, .ie8 .icon-mercurial:before, .ie8 .icon-jobs:before, .ie8 .icon-help:before, .ie8 .icon-download:before, .ie8 .icon-documentation:before, .ie8 .icon-community:before, .ie8 .icon-code:before, .ie8 .icon-close:before, .ie8 .icon-calendar:before, .ie8 .icon-beginner:before, .ie8 .icon-advanced:before, .ie8 .icon-sitemap:before, .ie8 .icon-search:before, .ie8 .icon-search-alt:before, .ie8 .icon-python:before, .ie8 .icon-github:before, .ie8 .icon-get-started:before, .ie8 .icon-feed:before, .ie8 .icon-facebook:before, .ie8 .icon-email:before, .ie8 .icon-arrow-up:before, .ie8 .icon-arrow-right:before, .ie8 .icon-arrow-left:before, .ie8 .icon-arrow-down:before, .ie8 .errorlist:before, .ie8 .icon-freenode:before, .ie8 .icon-alert:before, .ie8 .icon-versions:before, .ie8 .icon-twitter:before, .ie8 .icon-thumbs-up:before, .ie8 .icon-thumbs-down:before, .ie8 .icon-text-resize:before, .ie8 .icon-success-stories:before, .ie8 .icon-statistics:before, .ie8 .icon-stack-overflow:before, .ie8 .icon-mastodon:before { display: inline; } -.ie8 .icon-megaphone span, .ie8 .icon-python-alt span, .ie8 .icon-pypi span, .ie8 .icon-news span, .ie8 .icon-moderate span, .ie8 .icon-mercurial span, .ie8 .icon-jobs span, .ie8 .icon-help span, .ie8 .icon-download span, .ie8 .icon-documentation span, .ie8 .icon-community span, .ie8 .icon-code span, .ie8 .icon-close span, .ie8 .icon-calendar span, .ie8 .icon-beginner span, .ie8 .icon-advanced span, .ie8 .icon-sitemap span, .ie8 .icon-search span, .ie8 .icon-search-alt span, .ie8 .icon-python span, .ie8 .icon-github span, .ie8 .icon-get-started span, .ie8 .icon-feed span, .ie8 .icon-facebook span, .ie8 .icon-email span, .ie8 .icon-arrow-up span, .ie8 .icon-arrow-right span, .ie8 .icon-arrow-left span, .ie8 .icon-arrow-down span, .ie8 .errorlist:before span, .ie8 .icon-freenode span, .ie8 .icon-alert span, .ie8 .icon-versions span, .ie8 .icon-twitter span, .ie8 .icon-thumbs-up span, .ie8 .icon-thumbs-down span, .ie8 .icon-text-resize span, .ie8 .icon-success-stories span, .ie8 .icon-statistics span, .ie8 .icon-stack-overflow span { +.ie8 .icon-megaphone span, .ie8 .icon-python-alt span, .ie8 .icon-pypi span, .ie8 .icon-news span, .ie8 .icon-moderate span, .ie8 .icon-mercurial span, .ie8 .icon-jobs span, .ie8 .icon-help span, .ie8 .icon-download span, .ie8 .icon-documentation span, .ie8 .icon-community span, .ie8 .icon-code span, .ie8 .icon-close span, .ie8 .icon-calendar span, .ie8 .icon-beginner span, .ie8 .icon-advanced span, .ie8 .icon-sitemap span, .ie8 .icon-search span, .ie8 .icon-search-alt span, .ie8 .icon-python span, .ie8 .icon-github span, .ie8 .icon-get-started span, .ie8 .icon-feed span, .ie8 .icon-facebook span, .ie8 .icon-email span, .ie8 .icon-arrow-up span, .ie8 .icon-arrow-right span, .ie8 .icon-arrow-left span, .ie8 .icon-arrow-down span, .ie8 .errorlist:before span, .ie8 .icon-freenode span, .ie8 .icon-alert span, .ie8 .icon-versions span, .ie8 .icon-twitter span, .ie8 .icon-thumbs-up span, .ie8 .icon-thumbs-down span, .ie8 .icon-text-resize span, .ie8 .icon-success-stories span, .ie8 .icon-statistics span, .ie8 .icon-stack-overflow span, .ie8 .icon-mastodon span { display: none; } /* @license diff --git a/static/sass/style.scss b/static/sass/style.scss index aeecbc72b..45998bbc1 100644 --- a/static/sass/style.scss +++ b/static/sass/style.scss @@ -2410,7 +2410,7 @@ span.highlighted { /* ! ===== ICONS ===== */ /* Look inside _fonts.scss for most of the code. We declare this here so we can adjust as needed for specific elements. */ -.icon-megaphone, .icon-python-alt, .icon-pypi, .icon-news, .icon-moderate, .icon-mercurial, .icon-jobs, .icon-help, .icon-download, .icon-documentation, .icon-community, .icon-code, .icon-close, .icon-calendar, .icon-beginner, .icon-advanced, .icon-sitemap, .icon-search, .icon-search-alt, .icon-python, .icon-github, .icon-get-started, .icon-feed, .icon-facebook, .icon-email, .icon-arrow-up, .icon-arrow-right, .icon-arrow-left, .icon-arrow-down, .icon-freenode, .icon-alert, .icon-versions, .icon-twitter, .icon-thumbs-up, .icon-thumbs-down, .icon-text-resize, .icon-success-stories, .icon-statistics, .icon-stack-overflow { +.icon-megaphone, .icon-python-alt, .icon-pypi, .icon-news, .icon-moderate, .icon-mercurial, .icon-jobs, .icon-help, .icon-download, .icon-documentation, .icon-community, .icon-code, .icon-close, .icon-calendar, .icon-beginner, .icon-advanced, .icon-sitemap, .icon-search, .icon-search-alt, .icon-python, .icon-github, .icon-get-started, .icon-feed, .icon-facebook, .icon-email, .icon-arrow-up, .icon-arrow-right, .icon-arrow-left, .icon-arrow-down, .icon-freenode, .icon-alert, .icon-versions, .icon-twitter, .icon-thumbs-up, .icon-thumbs-down, .icon-text-resize, .icon-success-stories, .icon-statistics, .icon-stack-overflow, .icon-mastodon { font-family: 'Pythonicon'; speak: none; font-style: normal; diff --git a/templates/base.html b/templates/base.html index cf4c65cb0..ffa517a91 100644 --- a/templates/base.html +++ b/templates/base.html @@ -236,8 +236,9 @@

    Socialize From f274b4f340dfb943ba846af5da81c9603ae55e6e Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Wed, 15 Nov 2023 09:51:17 -0500 Subject: [PATCH 034/112] upgrade elasticsearch client --- base-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base-requirements.txt b/base-requirements.txt index b19aacc93..998625e1d 100644 --- a/base-requirements.txt +++ b/base-requirements.txt @@ -22,7 +22,7 @@ chardet==4.0.0 # TODO: We may drop 'django-imagekit' completely. django-imagekit==4.0.2 django-haystack==3.0 -elasticsearch>=5,<6 +elasticsearch>=7,<8 # TODO: 0.14.0 only supports Django 1.8 and 1.11. django-tastypie==0.14.3 From ac85091d1c3937fba565c8f1597366ff1b34b495 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Wed, 15 Nov 2023 09:54:54 -0500 Subject: [PATCH 035/112] upgrade django-haystack --- base-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base-requirements.txt b/base-requirements.txt index 998625e1d..9ddabf236 100644 --- a/base-requirements.txt +++ b/base-requirements.txt @@ -21,7 +21,7 @@ icalendar==4.0.7 chardet==4.0.0 # TODO: We may drop 'django-imagekit' completely. django-imagekit==4.0.2 -django-haystack==3.0 +django-haystack==3.2.1 elasticsearch>=7,<8 # TODO: 0.14.0 only supports Django 1.8 and 1.11. django-tastypie==0.14.3 From 82682b072d615ad7563aa64232c247ee54354142 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Wed, 15 Nov 2023 09:58:28 -0500 Subject: [PATCH 036/112] use new backend --- pydotorg/settings/heroku.py | 2 +- pydotorg/settings/local.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pydotorg/settings/heroku.py b/pydotorg/settings/heroku.py index ab9646936..c32c9c67b 100644 --- a/pydotorg/settings/heroku.py +++ b/pydotorg/settings/heroku.py @@ -26,7 +26,7 @@ HAYSTACK_CONNECTIONS = { 'default': { - 'ENGINE': 'haystack.backends.elasticsearch5_backend.Elasticsearch5SearchEngine', + 'ENGINE': 'haystack.backends.elasticsearch7_backend.Elasticsearch7SearchEngine', 'URL': HAYSTACK_SEARCHBOX_SSL_URL, 'INDEX_NAME': 'haystack-prod', }, diff --git a/pydotorg/settings/local.py b/pydotorg/settings/local.py index 4ecbe35aa..6525d9837 100644 --- a/pydotorg/settings/local.py +++ b/pydotorg/settings/local.py @@ -26,7 +26,7 @@ HAYSTACK_CONNECTIONS = { 'default': { - 'ENGINE': 'haystack.backends.elasticsearch5_backend.Elasticsearch5SearchEngine', + 'ENGINE': 'haystack.backends.elasticsearch7_backend.Elasticsearch7SearchEngine', 'URL': HAYSTACK_SEARCHBOX_SSL_URL, 'INDEX_NAME': 'haystack', }, From e4ee9ce52bd7ad43032296eede85f7c26ea51b56 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Wed, 15 Nov 2023 10:40:58 -0500 Subject: [PATCH 037/112] make index name configurable --- pydotorg/settings/heroku.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pydotorg/settings/heroku.py b/pydotorg/settings/heroku.py index c32c9c67b..83e975cb1 100644 --- a/pydotorg/settings/heroku.py +++ b/pydotorg/settings/heroku.py @@ -28,7 +28,7 @@ 'default': { 'ENGINE': 'haystack.backends.elasticsearch7_backend.Elasticsearch7SearchEngine', 'URL': HAYSTACK_SEARCHBOX_SSL_URL, - 'INDEX_NAME': 'haystack-prod', + 'INDEX_NAME': config('HAYSTACK_INDEX', default='haystack-prod'), }, } From 67207962a817b4dc345843f7524fd2da8f4f2252 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Wed, 15 Nov 2023 10:51:14 -0500 Subject: [PATCH 038/112] this is just a 1/2/3 differentiator, disregard in search --- downloads/search_indexes.py | 1 - 1 file changed, 1 deletion(-) diff --git a/downloads/search_indexes.py b/downloads/search_indexes.py index 307841283..7d476fb33 100644 --- a/downloads/search_indexes.py +++ b/downloads/search_indexes.py @@ -13,7 +13,6 @@ class ReleaseIndex(indexes.SearchIndex, indexes.Indexable): name = indexes.CharField(model_attr='name') description = indexes.CharField() path = indexes.CharField() - version = indexes.CharField(model_attr='version') release_notes_url = indexes.CharField(model_attr='release_notes_url') release_date = indexes.DateTimeField(model_attr='release_date') From c94985579635ad1791246493f7ec024ebe9abbac Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 21 Nov 2023 10:18:59 +0200 Subject: [PATCH 039/112] Add config file for Read the Docs (#2328) * Add config file for Read the Docs * Remove comment --- .gitignore | 1 + .readthedocs.yaml | 15 +++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 .readthedocs.yaml diff --git a/.gitignore b/.gitignore index 954ff2401..a9eca9d19 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ # $ git config --global core.excludesfile ~/.gitignore_global .sass-cache/ +docs/build media/* static-root/ static/stylesheets/mq.css diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 000000000..ec9dc1ce9 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,15 @@ +# Read the Docs configuration file +# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details +# Project page: https://readthedocs.org/projects/pythondotorg/ + +version: 2 + +build: + os: ubuntu-22.04 + tools: + python: "3" + + commands: + - python -m pip install -r docs-requirements.txt + - make -C docs html JOBS=$(nproc) BUILDDIR=_readthedocs + - mv docs/_readthedocs _readthedocs From f04b96f59147015676cf2b283684b381aef27a55 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade Date: Tue, 21 Nov 2023 10:22:56 +0200 Subject: [PATCH 040/112] Remove broken Twitter widget (#2329) * Remove broken Twitter widget * Remove broken Twitter widget --- static/sass/style.css | 4 --- static/sass/style.scss | 3 -- templates/components/tweets-from-psf.html | 4 --- templates/pages/default.html | 2 -- templates/pages/pep-page.html | 2 -- templates/psf/default.html | 2 -- templates/python/inner.html | 33 +--------------------- templates/successstories/base.html | 2 -- templates/waitforit.html | 34 +---------------------- 9 files changed, 2 insertions(+), 84 deletions(-) delete mode 100644 templates/components/tweets-from-psf.html diff --git a/static/sass/style.css b/static/sass/style.css index ad49c77b4..c3d2bb5f9 100644 --- a/static/sass/style.css +++ b/static/sass/style.css @@ -2771,10 +2771,6 @@ p.quote-by-organization { /* {% endblock left_sidebar %} diff --git a/templates/python/inner.html b/templates/python/inner.html index 06b1ad99e..542e6cb64 100644 --- a/templates/python/inner.html +++ b/templates/python/inner.html @@ -623,40 +623,9 @@

    Form Example

    {% block left_sidebar %} {% endblock left_sidebar %} diff --git a/templates/waitforit.html b/templates/waitforit.html index a7bc8f532..a27a9e274 100644 --- a/templates/waitforit.html +++ b/templates/waitforit.html @@ -22,37 +22,5 @@

    Wait for it…

    {% block left_sidebar %} -{% endblock left_sidebar %} \ No newline at end of file +{% endblock left_sidebar %} From 0f881058596384d2ff167ade73d732edac58068c Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Sat, 9 Dec 2023 10:10:41 -0500 Subject: [PATCH 041/112] fix misleading link in site-tree fixture --- fixtures/sitetree_menus.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fixtures/sitetree_menus.json b/fixtures/sitetree_menus.json index 85fb6b6b0..70ad3fc7c 100644 --- a/fixtures/sitetree_menus.json +++ b/fixtures/sitetree_menus.json @@ -2557,7 +2557,7 @@ "fields": { "title": "PSF Sponsors", "hint": "", - "url": "/psf/sponsorship/sponsors/", + "url": "/psf/sponsors/", "urlaspattern": false, "tree": 1, "hidden": false, From e6118a4540060d53ad807a846979b34952fb208c Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Thu, 14 Dec 2023 14:14:27 -0500 Subject: [PATCH 042/112] Update sponsor_new_application.txt --- templates/sponsors/email/sponsor_new_application.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/templates/sponsors/email/sponsor_new_application.txt b/templates/sponsors/email/sponsor_new_application.txt index 486e4ef34..e859386bf 100644 --- a/templates/sponsors/email/sponsor_new_application.txt +++ b/templates/sponsors/email/sponsor_new_application.txt @@ -1,9 +1,11 @@ {% load sponsors %} Dear {{ sponsorship.sponsor.name }} {% if sponsorship.for_modified_package %} -Thank you for submitting your sponsorship application. We will contact you to discuss finalizing the customized sponsorship package within 2 business days. +Thank you for submitting your sponsorship application. +We will contact you to discuss finalizing the customized sponsorship package within 5 business days. {% else %} -Thank you for submitting your sponsorship application. We will be sending a Contract reflecting the sponsorship contract details. +Thank you for submitting your sponsorship application. +We will be sending a Contract reflecting the sponsorship contract details within 5 business days. {% endif %} You can review your full application and a list of benefits you will receive below. From 91fc8ccdf64d16618f49824c3b014f8751aa82b1 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Thu, 14 Dec 2023 14:21:50 -0500 Subject: [PATCH 043/112] update sponsor contract with new info, fix sponsorship year --- .../sponsors/admin/contract-template.docx | Bin 15061 -> 15199 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/templates/sponsors/admin/contract-template.docx b/templates/sponsors/admin/contract-template.docx index 6316a3eb18f1d361e5e2894ec8074796df09e312..5bdc44525a4d15367bcaad989f5d63ba6c278233 100644 GIT binary patch delta 10927 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 From 1296660a17266a94e788b0dbc940404d1066bbc9 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Thu, 14 Dec 2023 14:33:36 -0500 Subject: [PATCH 044/112] fix notice in post-roll on sponsor application --- templates/sponsors/sponsorship_application_finished.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/sponsors/sponsorship_application_finished.html b/templates/sponsors/sponsorship_application_finished.html index b7bb92953..15fd823c7 100644 --- a/templates/sponsors/sponsorship_application_finished.html +++ b/templates/sponsors/sponsorship_application_finished.html @@ -13,7 +13,7 @@

    Application submitted!


    Thank you for submitting your application to sponsor the PSF ecosystem.

    -

    Our team has been notified and will contact you within 2 business days to discuss next steps.

    +

    Our team has been notified and will contact you within 5 business days to discuss next steps.

    A confirmation has been emailed to {% for item in notified %}{% if forloop.first %}{% else %}{% if forloop.last %} and {% else %}, {% endif %}{% endif %}{{item}}{% endfor %}.

    If you have any questions please respond to the confirmation email or contact sponsors@python.org

    - The Python Software Foundation Sponsorship Team

    From fad5f2b7e4d5e2f08fc7d2e11c2c380bdc60efe0 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Thu, 14 Dec 2023 14:46:07 -0500 Subject: [PATCH 045/112] filtering by current_year where necessary --- sponsors/admin.py | 2 +- sponsors/forms.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/sponsors/admin.py b/sponsors/admin.py index aa3d5408e..ac05a00b8 100644 --- a/sponsors/admin.py +++ b/sponsors/admin.py @@ -258,7 +258,7 @@ class TargetableEmailBenefitsFilter(admin.SimpleListFilter): @cached_property def benefits(self): qs = EmailTargetableConfiguration.objects.all().values_list("benefit_id", flat=True) - benefits = SponsorshipBenefit.objects.filter(id__in=Subquery(qs)) + benefits = SponsorshipBenefit.objects.filter(id__in=Subquery(qs), year=SponsorshipCurrentYear.get_year()) return {str(b.id): b for b in benefits} def lookups(self, request, model_admin): diff --git a/sponsors/forms.py b/sponsors/forms.py index 01d3de4f2..f4c72726a 100644 --- a/sponsors/forms.py +++ b/sponsors/forms.py @@ -127,6 +127,7 @@ def get_package(self): if not pkg_benefits and standalone: # standalone only pkg, _ = SponsorshipPackage.objects.get_or_create( slug="standalone-only", + year=SponsorshipCurrentYear.get_year(), defaults={"name": "Standalone Only", "sponsorship_amount": 0}, ) From 7b14c6c28bd7f8e23a5721e2a9f6a9e2912c2faf Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Thu, 14 Dec 2023 15:32:35 -0500 Subject: [PATCH 046/112] fix deletion of BenefitFeatures --- sponsors/models/benefits.py | 5 ++++- sponsors/models/managers.py | 9 +++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/sponsors/models/benefits.py b/sponsors/models/benefits.py index 51ec1870e..635b3f6b9 100644 --- a/sponsors/models/benefits.py +++ b/sponsors/models/benefits.py @@ -16,7 +16,7 @@ ######################################## # Benefit features abstract classes -from sponsors.models.managers import BenefitFeatureQuerySet +from sponsors.models.managers import BenefitFeatureQuerySet, BenefitFeatureConfigurationQuerySet ######################################## @@ -307,11 +307,14 @@ class BenefitFeatureConfiguration(PolymorphicModel): Base class for sponsorship benefits configuration. """ + objects = BenefitFeatureQuerySet.as_manager() benefit = models.ForeignKey("sponsors.SponsorshipBenefit", on_delete=models.CASCADE) + non_polymorphic = models.Manager() class Meta: verbose_name = "Benefit Feature Configuration" verbose_name_plural = "Benefit Feature Configurations" + base_manager_name = 'non_polymorphic' @property def benefit_feature_class(self): diff --git a/sponsors/models/managers.py b/sponsors/models/managers.py index 4681532f5..5cb241fc9 100644 --- a/sponsors/models/managers.py +++ b/sponsors/models/managers.py @@ -146,6 +146,15 @@ def provided_assets(self): return self.instance_of(*provided_assets_classes).select_related("sponsor_benefit__sponsorship") +class BenefitFeatureConfigurationQuerySet(PolymorphicQuerySet): + + def delete(self): + if not self.polymorphic_disabled: + return self.non_polymorphic().delete() + else: + return super().delete() + + class GenericAssetQuerySet(PolymorphicQuerySet): def all_assets(self): From 82016f407e8a0faf0936e3667786b687c8aa46b5 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Thu, 14 Dec 2023 15:35:27 -0500 Subject: [PATCH 047/112] missing migration --- .../migrations/0095_auto_20231214_2025.py | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 sponsors/migrations/0095_auto_20231214_2025.py diff --git a/sponsors/migrations/0095_auto_20231214_2025.py b/sponsors/migrations/0095_auto_20231214_2025.py new file mode 100644 index 000000000..e656bf05c --- /dev/null +++ b/sponsors/migrations/0095_auto_20231214_2025.py @@ -0,0 +1,83 @@ +# Generated by Django 2.2.24 on 2023-12-14 20:25 + +from django.db import migrations +import django.db.models.manager + + +class Migration(migrations.Migration): + dependencies = [ + ("sponsors", "0094_sponsorship_locked"), + ] + + operations = [ + migrations.AlterModelOptions( + name="benefitfeatureconfiguration", + options={ + "base_manager_name": "non_polymorphic", + "verbose_name": "Benefit Feature Configuration", + "verbose_name_plural": "Benefit Feature Configurations", + }, + ), + migrations.AlterModelManagers( + name="benefitfeatureconfiguration", + managers=[ + ("non_polymorphic", django.db.models.manager.Manager()), + ], + ), + migrations.AlterModelManagers( + name="emailtargetableconfiguration", + managers=[ + ("non_polymorphic", django.db.models.manager.Manager()), + ("objects", django.db.models.manager.Manager()), + ], + ), + migrations.AlterModelManagers( + name="logoplacementconfiguration", + managers=[ + ("non_polymorphic", django.db.models.manager.Manager()), + ("objects", django.db.models.manager.Manager()), + ], + ), + migrations.AlterModelManagers( + name="providedfileassetconfiguration", + managers=[ + ("non_polymorphic", django.db.models.manager.Manager()), + ("objects", django.db.models.manager.Manager()), + ], + ), + migrations.AlterModelManagers( + name="providedtextassetconfiguration", + managers=[ + ("non_polymorphic", django.db.models.manager.Manager()), + ("objects", django.db.models.manager.Manager()), + ], + ), + migrations.AlterModelManagers( + name="requiredimgassetconfiguration", + managers=[ + ("non_polymorphic", django.db.models.manager.Manager()), + ("objects", django.db.models.manager.Manager()), + ], + ), + migrations.AlterModelManagers( + name="requiredresponseassetconfiguration", + managers=[ + ("non_polymorphic", django.db.models.manager.Manager()), + ("objects", django.db.models.manager.Manager()), + ], + ), + migrations.AlterModelManagers( + name="requiredtextassetconfiguration", + managers=[ + ("non_polymorphic", django.db.models.manager.Manager()), + ("objects", django.db.models.manager.Manager()), + ], + ), + migrations.AlterModelManagers( + name="tieredbenefitconfiguration", + managers=[ + ("non_polymorphic", django.db.models.manager.Manager()), + ("objects", django.db.models.manager.Manager()), + ], + ), + ] From 7ba7d3620d7e16dbfc564cd0cc4cdf5449852b37 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Thu, 14 Dec 2023 16:08:35 -0500 Subject: [PATCH 048/112] missing migration --- .../migrations/0096_auto_20231214_2108.py | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 sponsors/migrations/0096_auto_20231214_2108.py diff --git a/sponsors/migrations/0096_auto_20231214_2108.py b/sponsors/migrations/0096_auto_20231214_2108.py new file mode 100644 index 000000000..11c6dde5b --- /dev/null +++ b/sponsors/migrations/0096_auto_20231214_2108.py @@ -0,0 +1,61 @@ +# Generated by Django 2.2.24 on 2023-12-14 21:08 + +from django.db import migrations +import django.db.models.manager + + +class Migration(migrations.Migration): + + dependencies = [ + ('sponsors', '0095_auto_20231214_2025'), + ] + + operations = [ + migrations.AlterModelManagers( + name='benefitfeatureconfiguration', + managers=[ + ('objects', django.db.models.manager.Manager()), + ('non_polymorphic', django.db.models.manager.Manager()), + ], + ), + migrations.AlterModelManagers( + name='emailtargetableconfiguration', + managers=[ + ], + ), + migrations.AlterModelManagers( + name='logoplacementconfiguration', + managers=[ + ], + ), + migrations.AlterModelManagers( + name='providedfileassetconfiguration', + managers=[ + ], + ), + migrations.AlterModelManagers( + name='providedtextassetconfiguration', + managers=[ + ], + ), + migrations.AlterModelManagers( + name='requiredimgassetconfiguration', + managers=[ + ], + ), + migrations.AlterModelManagers( + name='requiredresponseassetconfiguration', + managers=[ + ], + ), + migrations.AlterModelManagers( + name='requiredtextassetconfiguration', + managers=[ + ], + ), + migrations.AlterModelManagers( + name='tieredbenefitconfiguration', + managers=[ + ], + ), + ] From 4ef43887cf19fd394ae7dd2ec5d1c0cf5d4d7f84 Mon Sep 17 00:00:00 2001 From: Jessie <70440141+jessiebelle@users.noreply.github.com> Date: Tue, 19 Dec 2023 21:20:39 +0200 Subject: [PATCH 049/112] Sponsorship - adding renewal option for contract generation (#2344) * WIP renewal work * test fix * removing venv added files * tidy and fixup * test fixup after logic changes * Sponsorship renewal review (#2345) * add rewnewal to the admin view for sponsorship * use the sponsorship form directly rather than editing template * include previous effective date in context/review form for renewals * update to real renewal contract * missing migration --------- Co-authored-by: Ee Durbin --- sponsors/admin.py | 1 + sponsors/forms.py | 9 ++++- .../migrations/0097_sponsorship_renewal.py | 18 +++++++++ .../migrations/0098_auto_20231219_1910.py | 18 +++++++++ sponsors/models/sponsorship.py | 13 +++++- sponsors/pdf.py | 10 ++++- sponsors/tests/test_pdf.py | 38 ++++++++++++++++++ sponsors/tests/test_use_cases.py | 18 +++++++++ sponsors/use_cases.py | 3 ++ sponsors/views_admin.py | 6 ++- .../sponsors/admin/approve_application.html | 22 +++++++++- .../admin/renewal-contract-template.docx | Bin 0 -> 9245 bytes 12 files changed, 149 insertions(+), 7 deletions(-) create mode 100644 sponsors/migrations/0097_sponsorship_renewal.py create mode 100644 sponsors/migrations/0098_auto_20231219_1910.py create mode 100644 templates/sponsors/admin/renewal-contract-template.docx diff --git a/sponsors/admin.py b/sponsors/admin.py index ac05a00b8..d6601140f 100644 --- a/sponsors/admin.py +++ b/sponsors/admin.py @@ -402,6 +402,7 @@ class SponsorshipAdmin(ImportExportActionModelAdmin, admin.ModelAdmin): "end_date", "get_contract", "level_name", + "renewal", "overlapped_by", ), }, diff --git a/sponsors/forms.py b/sponsors/forms.py index f4c72726a..8d262b337 100644 --- a/sponsors/forms.py +++ b/sponsors/forms.py @@ -392,6 +392,10 @@ class SponsorshipReviewAdminForm(forms.ModelForm): start_date = forms.DateField(widget=AdminDateWidget(), required=False) end_date = forms.DateField(widget=AdminDateWidget(), required=False) overlapped_by = forms.ModelChoiceField(queryset=Sponsorship.objects.select_related("sponsor", "package"), required=False) + renewal = forms.BooleanField( + help_text="If true, it means the sponsorship is a renewal of a previous sponsorship and will use the renewal template for contracting.", + required=False, + ) def __init__(self, *args, **kwargs): force_required = kwargs.pop("force_required", False) @@ -403,10 +407,12 @@ def __init__(self, *args, **kwargs): self.fields.pop("overlapped_by") # overlapped should never be displayed on approval for field_name in self.fields: self.fields[field_name].required = True + self.fields["renewal"].required = False + class Meta: model = Sponsorship - fields = ["start_date", "end_date", "package", "sponsorship_fee"] + fields = ["start_date", "end_date", "package", "sponsorship_fee", "renewal"] widgets = { 'year': SPONSORSHIP_YEAR_SELECT, } @@ -415,6 +421,7 @@ def clean(self): cleaned_data = super().clean() start_date = cleaned_data.get("start_date") end_date = cleaned_data.get("end_date") + renewal = cleaned_data.get("renewal") if start_date and end_date and end_date <= start_date: raise forms.ValidationError("End date must be greater than start date") diff --git a/sponsors/migrations/0097_sponsorship_renewal.py b/sponsors/migrations/0097_sponsorship_renewal.py new file mode 100644 index 000000000..fdbc347b3 --- /dev/null +++ b/sponsors/migrations/0097_sponsorship_renewal.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2023-12-18 16:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sponsors', '0096_auto_20231214_2108'), + ] + + operations = [ + migrations.AddField( + model_name='sponsorship', + name='renewal', + field=models.BooleanField(blank=True, null=True), + ), + ] diff --git a/sponsors/migrations/0098_auto_20231219_1910.py b/sponsors/migrations/0098_auto_20231219_1910.py new file mode 100644 index 000000000..3c466bb75 --- /dev/null +++ b/sponsors/migrations/0098_auto_20231219_1910.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2023-12-19 19:10 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sponsors', '0097_sponsorship_renewal'), + ] + + operations = [ + migrations.AlterField( + model_name='sponsorship', + name='renewal', + field=models.BooleanField(blank=True, help_text='If true, it means the sponsorship is a renewal of a previous sponsorship and will use the renewal template for contracting.', null=True), + ), + ] diff --git a/sponsors/models/sponsorship.py b/sponsors/models/sponsorship.py index 8e1d13a63..7443d4d2c 100644 --- a/sponsors/models/sponsorship.py +++ b/sponsors/models/sponsorship.py @@ -135,7 +135,7 @@ class Meta(OrderedModel.Meta): class Sponsorship(models.Model): """ - Represente a sponsorship application by a sponsor. + Represents a sponsorship application by a sponsor. It's responsible to group the set of selected benefits and link it to sponsor """ @@ -182,6 +182,11 @@ class Sponsorship(models.Model): package = models.ForeignKey(SponsorshipPackage, null=True, on_delete=models.SET_NULL) sponsorship_fee = models.PositiveIntegerField(null=True, blank=True) overlapped_by = models.ForeignKey("self", null=True, on_delete=models.SET_NULL) + renewal = models.BooleanField( + null=True, + blank=True, + help_text="If true, it means the sponsorship is a renewal of a previous sponsorship and will use the renewal template for contracting." + ) assets = GenericRelation(GenericAsset) @@ -378,6 +383,12 @@ def next_status(self): } return states_map[self.status] + @property + def previous_effective_date(self): + if len(self.sponsor.sponsorship_set.all().order_by('-year')) > 1: + return self.sponsor.sponsorship_set.all().order_by('-year')[1].start_date + return None + class SponsorshipBenefit(OrderedModel): """ diff --git a/sponsors/pdf.py b/sponsors/pdf.py index 5188b8290..f1b80d911 100644 --- a/sponsors/pdf.py +++ b/sponsors/pdf.py @@ -32,7 +32,9 @@ def _contract_context(contract, **context): "sponsorship": contract.sponsorship, "benefits": _clean_split(contract.benefits_list.raw), "legal_clauses": _clean_split(contract.legal_clauses.raw), + "renewal": contract.sponsorship.renewal, }) + context["previous_effective"] = contract.sponsorship.previous_effective_date if contract.sponsorship.previous_effective_date else "UNKNOWN" return context @@ -49,9 +51,13 @@ def render_contract_to_pdf_file(contract, **context): def _gen_docx_contract(output, contract, **context): - template = os.path.join(settings.TEMPLATES_DIR, "sponsors", "admin", "contract-template.docx") - doc = DocxTemplate(template) context = _contract_context(contract, **context) + renewal = context["renewal"] + if renewal: + template = os.path.join(settings.TEMPLATES_DIR, "sponsors", "admin", "renewal-contract-template.docx") + else: + template = os.path.join(settings.TEMPLATES_DIR, "sponsors", "admin", "contract-template.docx") + doc = DocxTemplate(template) doc.render(context) doc.save(output) return output diff --git a/sponsors/tests/test_pdf.py b/sponsors/tests/test_pdf.py index ec929d05e..2116b7c21 100644 --- a/sponsors/tests/test_pdf.py +++ b/sponsors/tests/test_pdf.py @@ -28,6 +28,8 @@ def setUp(self): "sponsorship": self.contract.sponsorship, "benefits": [], "legal_clauses": [], + "renewal": None, + "previous_effective": "UNKNOWN", } self.template = "sponsors/admin/preview-contract.html" @@ -71,3 +73,39 @@ def test_render_response_with_docx_attachment(self, MockDocxTemplate): response.get("Content-Type"), "application/vnd.openxmlformats-officedocument.wordprocessingml.document" ) + + @patch("sponsors.pdf.DocxTemplate") + def test_render_response_with_docx_attachment__renewal(self, MockDocxTemplate): + renewal_contract = baker.make_recipe("sponsors.tests.empty_contract", sponsorship__start_date=date.today(), + sponsorship__renewal=True) + text = f"{renewal_contract.benefits_list.raw}\n\n**Legal Clauses**\n{renewal_contract.legal_clauses.raw}" + html = render_md(text) + renewal_context = { + "contract": renewal_contract, + "start_date": renewal_contract.sponsorship.start_date, + "start_day_english_suffix": format(self.contract.sponsorship.start_date, "S"), + "sponsor": renewal_contract.sponsorship.sponsor, + "sponsorship": renewal_contract.sponsorship, + "benefits": [], + "legal_clauses": [], + "renewal": True, + "previous_effective": "UNKNOWN", + } + renewal_template = "sponsors/admin/preview-contract.html" + + template = Path(settings.TEMPLATES_DIR) / "sponsors" / "admin" / "renewal-contract-template.docx" + self.assertTrue(template.exists()) + mocked_doc = Mock(DocxTemplate) + MockDocxTemplate.return_value = mocked_doc + + request = Mock(HttpRequest) + response = render_contract_to_docx_response(request, renewal_contract) + + MockDocxTemplate.assert_called_once_with(str(template.resolve())) + mocked_doc.render.assert_called_once_with(renewal_context) + mocked_doc.save.assert_called_once_with(response) + self.assertEqual(response.get("Content-Disposition"), "attachment; filename=contract.docx") + self.assertEqual( + response.get("Content-Type"), + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + ) diff --git a/sponsors/tests/test_use_cases.py b/sponsors/tests/test_use_cases.py index 433d4950e..3e5e5ad04 100644 --- a/sponsors/tests/test_use_cases.py +++ b/sponsors/tests/test_use_cases.py @@ -118,6 +118,24 @@ def test_update_sponsorship_as_approved_and_create_contract(self): self.assertEqual(self.sponsorship.sponsorship_fee, 100) self.assertEqual(self.sponsorship.package, self.package) self.assertEqual(self.sponsorship.level_name, self.package.name) + self.assertFalse(self.sponsorship.renewal) + + + def test_update_renewal_sponsorship_as_approved_and_create_contract(self): + self.data.update({"renewal": True}) + self.use_case.execute(self.sponsorship, **self.data) + self.sponsorship.refresh_from_db() + + today = timezone.now().date() + self.assertEqual(self.sponsorship.approved_on, today) + self.assertEqual(self.sponsorship.status, Sponsorship.APPROVED) + self.assertTrue(self.sponsorship.contract.pk) + self.assertTrue(self.sponsorship.start_date) + self.assertTrue(self.sponsorship.end_date) + self.assertEqual(self.sponsorship.sponsorship_fee, 100) + self.assertEqual(self.sponsorship.package, self.package) + self.assertEqual(self.sponsorship.level_name, self.package.name) + self.assertEqual(self.sponsorship.renewal, True) def test_send_notifications_using_sponsorship(self): self.use_case.execute(self.sponsorship, **self.data) diff --git a/sponsors/use_cases.py b/sponsors/use_cases.py index 95b2d267e..bbb6f2483 100644 --- a/sponsors/use_cases.py +++ b/sponsors/use_cases.py @@ -55,11 +55,14 @@ def execute(self, sponsorship, start_date, end_date, **kwargs): sponsorship.approve(start_date, end_date) package = kwargs.get("package") fee = kwargs.get("sponsorship_fee") + renewal = kwargs.get("renewal", False) if package: sponsorship.package = package sponsorship.level_name = package.name if fee: sponsorship.sponsorship_fee = fee + if renewal: + sponsorship.renewal = True sponsorship.save() contract = Contract.new(sponsorship) diff --git a/sponsors/views_admin.py b/sponsors/views_admin.py index 8968da1b7..e9a808ccc 100644 --- a/sponsors/views_admin.py +++ b/sponsors/views_admin.py @@ -85,7 +85,11 @@ def approve_sponsorship_view(ModelAdmin, request, pk): ) return redirect(redirect_url) - context = {"sponsorship": sponsorship, "form": form} + context = { + "sponsorship": sponsorship, + "form": form, + "previous_effective": sponsorship.previous_effective_date if sponsorship.previous_effective_date else "UNKNOWN", + } return render(request, "sponsors/admin/approve_application.html", context=context) diff --git a/templates/sponsors/admin/approve_application.html b/templates/sponsors/admin/approve_application.html index 37ce49cdc..42a5f7382 100644 --- a/templates/sponsors/admin/approve_application.html +++ b/templates/sponsors/admin/approve_application.html @@ -2,7 +2,18 @@ {% extends 'admin/change_form.html' %} {% load i18n static sponsors %} -{% block extrastyle %}{{ block.super }}{% endblock %} +{% block extrastyle %} + {{ block.super }} + + +{% endblock %} {% block title %}Accept {{ sponsorship }} | python.org{% endblock %} @@ -33,8 +44,15 @@

    Generate Contract for Signing

    {{ form.media }} {{ form.as_p }} - +

    + + {{ previous_effective }} + The last known contract effective date for this sponsor. This will only impact renewals. If UNKNOWN, you MUST update the resulting docx with the correct effective date. +

    +
    diff --git a/templates/sponsors/admin/renewal-contract-template.docx b/templates/sponsors/admin/renewal-contract-template.docx new file mode 100644 index 0000000000000000000000000000000000000000..97b8d1cc673cb9df49be633c2b7e3e1d114f829e GIT binary patch literal 9245 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 V2m9>85D>`EkFIAoktKgQ`!AfFXAA%U literal 0 HcmV?d00001 From c00f46eee7d64f3a4d4a443bb6754c5047a02d4b Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Tue, 19 Dec 2023 14:49:42 -0500 Subject: [PATCH 050/112] formatting tweaks to the renewal contract --- sponsors/pdf.py | 4 +++- sponsors/tests/test_pdf.py | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/sponsors/pdf.py b/sponsors/pdf.py index f1b80d911..9855beee3 100644 --- a/sponsors/pdf.py +++ b/sponsors/pdf.py @@ -34,7 +34,9 @@ def _contract_context(contract, **context): "legal_clauses": _clean_split(contract.legal_clauses.raw), "renewal": contract.sponsorship.renewal, }) - context["previous_effective"] = contract.sponsorship.previous_effective_date if contract.sponsorship.previous_effective_date else "UNKNOWN" + previous_effective = contract.sponsorship.previous_effective_date + context["previous_effective"] = previous_effective if previous_effective else "UNKNOWN" + context["previous_effective_english_suffix"] = format(previous_effective, "S") if previous_effective else None return context diff --git a/sponsors/tests/test_pdf.py b/sponsors/tests/test_pdf.py index 2116b7c21..e4d140cf2 100644 --- a/sponsors/tests/test_pdf.py +++ b/sponsors/tests/test_pdf.py @@ -30,6 +30,7 @@ def setUp(self): "legal_clauses": [], "renewal": None, "previous_effective": "UNKNOWN", + "previous_effective_english_suffix": None, } self.template = "sponsors/admin/preview-contract.html" @@ -90,6 +91,7 @@ def test_render_response_with_docx_attachment__renewal(self, MockDocxTemplate): "legal_clauses": [], "renewal": True, "previous_effective": "UNKNOWN", + "previous_effective_english_suffix": None, } renewal_template = "sponsors/admin/preview-contract.html" From e8a5c8291368b711894859edf2bd3616cab50cdf Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Tue, 19 Dec 2023 15:02:10 -0500 Subject: [PATCH 051/112] actually add template change --- .../admin/renewal-contract-template.docx | Bin 9245 -> 9323 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/templates/sponsors/admin/renewal-contract-template.docx b/templates/sponsors/admin/renewal-contract-template.docx index 97b8d1cc673cb9df49be633c2b7e3e1d114f829e..3e36801a316f85a4a0484c7b4ed1a227a9fb4285 100644 GIT binary patch delta 6918 zcmZ9R1yCGax3vfNKyY_=x53?+5Zpq7PjL4^f)6@)aEIXTF2RBY2@pKE1REqk{^a}b zt^2;;sp_geU42fUT5GTBs%Ph@9IIf1)RB-00qE%HfRUVfY&rzQksKHg0uy9HYmgVO z>xwApJbI@X+y~ad0BP%1ex=6~v2=bdzirs^>%l*}2?K@Q2?*Tzmd-LSZ-xTo)fZ-0 zW{i0Sh!K&i1t#1*KquCW{fM!YB7#a>I%|=QOyR>|&9)@AB3i~a zlIEOmBYcVZW6aYMyeA>Zv}>e*|*I0{P*bLrhs{?!C~c*Y3Ik>=`rC10_k=PEP2 zyN3P)H3R9T50W4Ik^s-);0`zXY;x%VlqdxCu z8i7T7(#pL6G1Wc8mg}%?`wfssCVYBAi@$i~z5ZlJd+#sf&^Bqm1djHeiihl9kV-*D zRh2V+D+Ogswe8pnzp$EykQ|5JH?j>iN5QKtr|>7FHsF*XfChNTE?V;I=X4%t4*;Z& zhVE-AVC;+l0Bj%v0RQp@_8pNCBI^|P$B#S^Kz{8P_#=0@+=u#XGa}@ zg=~ve7~xlX7V&)0Ch_fe)?)ITeSy`>!fYBQChSUEVpds*H5=FQgcE?=HolkPvRHS+ z)#iKpOl!?tU5|CXV4p0$Lc%$;RvI1|*doeVCvqs-rW}CK%DVqHO-VGwdZgF%kf0P7GIG#f&WWAb&% zv{~!GA}qVg&d1<;>7C;!O}O)gvEP^9@uLd2c4LuErI28JZH4ziU*MZ-w7-gjg}c~5 ze-u~zqxe6A05bsmV-Wngw}Sa25B|wUqYTOz;@^y5p)*6Y7{uU#y#p~VOfwO9c3EdO zs7hq$^Cxfsz5Pvm6TVxeX>{wS6XVs?L>u}W=c=ZwuHW@}b8i~J+KqXx=T=yjZx?q5PH0sb;jDe7Lqe+p<%|w8vpt zxAfEU>II}ET|t8sQ4+nI!CO5VAGmT{7j@Je<*x=N%Mj950`jA`jm{J!O>4ZMA-8rM5E$a^Wmjk?zzl}=TE zjH>x*yf=(u_1IBLiS7Crcf`dEecI*PUWJ};tUxHp+$a-~Ze5m(dgiQOD53PJ7)-+v zpB!~r9^QM{O-6J#+a8~iFu_ERxh|aqR--DlRiPZjNJ=IWyQR)7QpjM-_rm4OOD923 zaVL3k2HwXO0_U`sUhyk(>?@cd$pHM&d4?HFdtCHNrYEVO5%@+$0}akRF4^I!hkcug zIAo**OZ~V-_|{k7+*47!lv;yGO`dz%D70v1=(CP-gNa{zj{Z|wdh<7@8If%xy!eA1`hS}M}K#vT!YKB@ELi-sGIx|@JfFf-tc&%=52 zL`X|Jo`S_Tℜ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 CTDs2w delta 6788 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 From cbc6c143922933a082ad600207ddb75703757fe3 Mon Sep 17 00:00:00 2001 From: Varun Chauhan <43171263+varunhc@users.noreply.github.com> Date: Tue, 19 Dec 2023 14:18:04 -0800 Subject: [PATCH 052/112] updated python issue tracker and pep links (#2318) * updated python issue tracker and pep links * Update templates/base.html Co-authored-by: Hugo van Kemenade --------- Co-authored-by: Hugo van Kemenade --- fixtures/boxes.json | 4 ++-- fixtures/sitetree_menus.json | 2 +- templates/base.html | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/fixtures/boxes.json b/fixtures/boxes.json index f7dbeb15e..b0e965011 100644 --- a/fixtures/boxes.json +++ b/fixtures/boxes.json @@ -654,9 +654,9 @@ "created": "2014-11-13T21:49:22.048Z", "updated": "2021-07-29T21:40:21.030Z", "label": "download-dev", - "content": "

    Information about specific ports, and developer info

    \r\n\r\n", + "content": "

    Information about specific ports, and developer info

    \r\n\r\n", "content_markup_type": "html", - "_content_rendered": "

    Information about specific ports, and developer info

    \r\n\r\n" + "_content_rendered": "

    Information about specific ports, and developer info

    \r\n\r\n" } }, { diff --git a/fixtures/sitetree_menus.json b/fixtures/sitetree_menus.json index 70ad3fc7c..f394233ee 100644 --- a/fixtures/sitetree_menus.json +++ b/fixtures/sitetree_menus.json @@ -685,7 +685,7 @@ "fields": { "title": "PEP Index", "hint": "", - "url": "http://python.org/dev/peps/", + "url": "https://peps.python.org", "urlaspattern": false, "tree": 1, "hidden": false, diff --git a/templates/base.html b/templates/base.html index ffa517a91..27daceb50 100644 --- a/templates/base.html +++ b/templates/base.html @@ -86,7 +86,7 @@ + href="https://peps.python.org/peps.rss"> Date: Tue, 2 Jan 2024 15:47:57 +0200 Subject: [PATCH 053/112] Fix for SVG upload in sponsorship application (#2352) * changing imagefield to file field on sponsorupdateform and sponsorshipapplicationform. adding django file validator to these two and the sponsor model * allow png upload * adding test to assert that svg can be uploaded * fix migration --- sponsors/forms.py | 7 +++++-- .../migrations/0099_auto_20231224_1854.py | 19 +++++++++++++++++++ sponsors/models/sponsors.py | 2 ++ sponsors/tests/test_forms.py | 18 ++++++++++++++++++ 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 sponsors/migrations/0099_auto_20231224_1854.py diff --git a/sponsors/forms.py b/sponsors/forms.py index 8d262b337..5a31605af 100644 --- a/sponsors/forms.py +++ b/sponsors/forms.py @@ -3,6 +3,7 @@ from django import forms from django.conf import settings from django.contrib.admin.widgets import AdminDateWidget +from django.core.validators import FileExtensionValidator from django.db.models import Q from django.utils import timezone from django.utils.functional import cached_property @@ -225,10 +226,11 @@ class SponsorshipApplicationForm(forms.Form): help_text="For display on our sponsor webpage. High resolution PNG or JPG, smallest dimension no less than 256px", required=False, ) - print_logo = forms.ImageField( + print_logo = forms.FileField( label="Sponsor print logo", help_text="For printed materials, signage, and projection. SVG or EPS", required=False, + validators=[FileExtensionValidator(['eps', 'epsf' 'epsi', 'svg', 'png'])], ) primary_phone = forms.CharField( @@ -557,10 +559,11 @@ class SponsorUpdateForm(forms.ModelForm): help_text="For display on our sponsor webpage. High resolution PNG or JPG, smallest dimension no less than 256px", required=False, ) - print_logo = forms.ImageField( + print_logo = forms.FileField( widget=forms.widgets.FileInput, help_text="For printed materials, signage, and projection. SVG or EPS", required=False, + validators=[FileExtensionValidator(['eps', 'epsf' 'epsi', 'svg', 'png'])], ) def __init__(self, *args, **kwargs): diff --git a/sponsors/migrations/0099_auto_20231224_1854.py b/sponsors/migrations/0099_auto_20231224_1854.py new file mode 100644 index 000000000..d8aaa436c --- /dev/null +++ b/sponsors/migrations/0099_auto_20231224_1854.py @@ -0,0 +1,19 @@ +# Generated by Django 2.2.24 on 2023-12-24 18:54 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sponsors', '0098_auto_20231219_1910'), + ] + + operations = [ + migrations.AlterField( + model_name='sponsor', + name='print_logo', + field=models.FileField(blank=True, help_text='For printed materials, signage, and projection. SVG or EPS', null=True, upload_to='sponsor_print_logos', validators=[django.core.validators.FileExtensionValidator(['eps', 'epsfepsi', 'svg', 'png'])], verbose_name='Print logo'), + ), + ] diff --git a/sponsors/models/sponsors.py b/sponsors/models/sponsors.py index 9b4d8fe86..eee7f585e 100644 --- a/sponsors/models/sponsors.py +++ b/sponsors/models/sponsors.py @@ -3,6 +3,7 @@ """ from allauth.account.models import EmailAddress from django.conf import settings +from django.core.validators import FileExtensionValidator from django.db import models from django.core.exceptions import ObjectDoesNotExist from django.template.defaultfilters import slugify @@ -51,6 +52,7 @@ class Sponsor(ContentManageable): ) print_logo = models.FileField( upload_to="sponsor_print_logos", + validators=[FileExtensionValidator(['eps', 'epsf' 'epsi', 'svg', 'png'])], blank=True, null=True, verbose_name="Print logo", diff --git a/sponsors/tests/test_forms.py b/sponsors/tests/test_forms.py index 058e21625..123dc1729 100644 --- a/sponsors/tests/test_forms.py +++ b/sponsors/tests/test_forms.py @@ -1,3 +1,6 @@ +from pathlib import Path + +from django.core.files.uploadedfile import SimpleUploadedFile from model_bakery import baker from django.conf import settings @@ -438,6 +441,21 @@ def test_create_sponsor_with_valid_data_for_non_required_inputs( self.assertEqual(sponsor.landing_page_url, "https://companyx.com") self.assertEqual(sponsor.twitter_handle, "@companyx") + def test_create_sponsor_with_svg_for_print_logo( + self, + ): + tick_svg = Path(settings.STATICFILES_DIRS[0]) / "img"/"sponsors"/"tick.svg" + with tick_svg.open("rb") as fd: + uploaded_svg = SimpleUploadedFile("tick.svg", fd.read()) + self.files["print_logo"] = uploaded_svg + + form = SponsorshipApplicationForm(self.data, self.files) + self.assertTrue(form.is_valid(), form.errors) + + sponsor = form.save() + + self.assertTrue(sponsor.print_logo) + def test_use_previous_user_sponsor(self): contact = baker.make(SponsorContact, user__email="foo@foo.com") self.data = {"sponsor": contact.sponsor.id} From db9d241e2d1f721785dc8df57268e612e09cb146 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Fri, 5 Jan 2024 08:41:41 -0500 Subject: [PATCH 054/112] update sponsor voucher fulfillment for 2024 --- .../create_pycon_vouchers_for_sponsors.py | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/sponsors/management/commands/create_pycon_vouchers_for_sponsors.py b/sponsors/management/commands/create_pycon_vouchers_for_sponsors.py index f8b99855a..3e3b4973d 100644 --- a/sponsors/management/commands/create_pycon_vouchers_for_sponsors.py +++ b/sponsors/management/commands/create_pycon_vouchers_for_sponsors.py @@ -20,22 +20,26 @@ ) BENEFITS = { - 121: { - "internal_name": "full_conference_passes_2023_code", + 183: { + "internal_name": "full_conference_passes_code_2024", "voucher_type": "SPNS_COMP_", }, - 139: { - "internal_name": "expo_hall_only_passes_2023_code", + 201: { + "internal_name": "expo_hall_only_passes_code_2024", "voucher_type": "SPNS_EXPO_COMP_", }, - 148: { - "internal_name": "additional_full_conference_passes_2023_code", + 208: { + "internal_name": "additional_full_conference_passes_code_2024", "voucher_type": "SPNS_ADDL_DISC_REG_", }, - 166: { - "internal_name": "online_only_conference_passes_2023_code", + 225: { + "internal_name": "online_only_conference_passes_2024", "voucher_type": "SPNS_ONLINE_COMP_", }, + 237: { + "internal_name": "additional_expo_hall_only_passes_2024", + "voucher_type": "SPNS_EXPO_DISC_", + }, } From 9b4deddbd43cf6e5518a72ddcbc4c94c7b6d487f Mon Sep 17 00:00:00 2001 From: Jessie <70440141+jessiebelle@users.noreply.github.com> Date: Tue, 9 Jan 2024 14:16:58 +0200 Subject: [PATCH 055/112] add new incorporation fields to form and sponsor model (#2351) * adding new fields to form and sponsor model * adding new optional fields to update sponsor application form * fix migrations * modifying existing tests to assert new fields are correctly saved * Re-structure and re-order sponsor information form * update and refactor of new_sponsorship_application_form to be usable for editing * remove migration * new migration file added * merge * add migration * fix tests to reflect update in template --------- Co-authored-by: Ee Durbin --- sponsors/forms.py | 11 +- .../migrations/0100_auto_20240107_1054.py | 29 ++++ sponsors/models/sponsors.py | 9 +- sponsors/tests/test_forms.py | 8 +- .../new_sponsorship_application_form.html | 126 +++++++++++++----- templates/users/sponsor_info_update.html | 55 +++++++- users/tests/test_views.py | 2 +- users/views.py | 2 +- 8 files changed, 199 insertions(+), 43 deletions(-) create mode 100644 sponsors/migrations/0100_auto_20240107_1054.py diff --git a/sponsors/forms.py b/sponsors/forms.py index 5a31605af..21258f3b2 100644 --- a/sponsors/forms.py +++ b/sponsors/forms.py @@ -253,10 +253,17 @@ class SponsorshipApplicationForm(forms.Form): state = forms.CharField( label="State/Province/Region", max_length=64, required=False ) + state_of_incorporation = forms.CharField( + label="State of incorporation", help_text="US only, If different than mailing address", max_length=64, required=False + ) postal_code = forms.CharField( label="Zip/Postal Code", max_length=64, required=False ) - country = CountryField().formfield(required=False) + country = CountryField().formfield(required=False, help_text="For mailing/contact purposes") + + country_of_incorporation = CountryField().formfield( + label="Country of incorporation", help_text="For contractual purposes", required=False + ) def __init__(self, *args, **kwargs): self.user = kwargs.pop("user", None) @@ -373,6 +380,8 @@ def save(self): landing_page_url=self.cleaned_data.get("landing_page_url", ""), twitter_handle=self.cleaned_data["twitter_handle"], print_logo=self.cleaned_data.get("print_logo"), + country_of_incorporation=self.cleaned_data.get("country_of_incorporation", ""), + state_of_incorporation=self.cleaned_data.get("state_of_incorporation", ""), ) contacts = [f.save(commit=False) for f in self.contacts_formset.forms] for contact in contacts: diff --git a/sponsors/migrations/0100_auto_20240107_1054.py b/sponsors/migrations/0100_auto_20240107_1054.py new file mode 100644 index 000000000..8bad2bc92 --- /dev/null +++ b/sponsors/migrations/0100_auto_20240107_1054.py @@ -0,0 +1,29 @@ +# Generated by Django 2.2.24 on 2024-01-07 10:54 + +from django.db import migrations, models +import django_countries.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('sponsors', '0099_auto_20231224_1854'), + ] + + operations = [ + migrations.AddField( + model_name='sponsor', + name='country_of_incorporation', + field=django_countries.fields.CountryField(blank=True, help_text='For contractual purposes', max_length=2, null=True, verbose_name='Country of incorporation (If different)'), + ), + migrations.AddField( + model_name='sponsor', + name='state_of_incorporation', + field=models.CharField(blank=True, default='', max_length=64, null=True, verbose_name='US only: State of incorporation (If different)'), + ), + migrations.AlterField( + model_name='sponsor', + name='country', + field=django_countries.fields.CountryField(default='', help_text='For mailing/contact purposes', max_length=2), + ), + ] diff --git a/sponsors/models/sponsors.py b/sponsors/models/sponsors.py index eee7f585e..ba0cff83d 100644 --- a/sponsors/models/sponsors.py +++ b/sponsors/models/sponsors.py @@ -73,8 +73,15 @@ class Sponsor(ContentManageable): postal_code = models.CharField( verbose_name="Zip/Postal Code", max_length=64, default="" ) - country = CountryField(default="") + country = CountryField(default="", help_text="For mailing/contact purposes") assets = GenericRelation(GenericAsset) + country_of_incorporation = CountryField( + verbose_name="Country of incorporation (If different)", help_text="For contractual purposes", blank=True, null=True + ) + state_of_incorporation = models.CharField( + verbose_name="US only: State of incorporation (If different)", + max_length=64, blank=True, null=True, default="" + ) class Meta: verbose_name = "sponsor" diff --git a/sponsors/tests/test_forms.py b/sponsors/tests/test_forms.py index 123dc1729..49b0515cd 100644 --- a/sponsors/tests/test_forms.py +++ b/sponsors/tests/test_forms.py @@ -423,14 +423,18 @@ def test_create_sponsor_with_valid_data(self): def test_create_sponsor_with_valid_data_for_non_required_inputs( self, ): + user = baker.make(settings.AUTH_USER_MODEL) + self.data["description"] = "Important company" self.data["landing_page_url"] = "https://companyx.com" self.data["twitter_handle"] = "@companyx" + self.data["country_of_incorporation"] = "US" + self.data["state_of_incorporation"] = "NY" self.files["print_logo"] = get_static_image_file_as_upload( "psf-logo_print.png", "logo_print.png" ) - form = SponsorshipApplicationForm(self.data, self.files) + form = SponsorshipApplicationForm(self.data, self.files, user=user) self.assertTrue(form.is_valid(), form.errors) sponsor = form.save() @@ -440,6 +444,8 @@ def test_create_sponsor_with_valid_data_for_non_required_inputs( self.assertFalse(form.user_with_previous_sponsors) self.assertEqual(sponsor.landing_page_url, "https://companyx.com") self.assertEqual(sponsor.twitter_handle, "@companyx") + self.assertEqual(sponsor.country_of_incorporation, "US") + self.assertEqual(sponsor.state_of_incorporation, "NY") def test_create_sponsor_with_svg_for_print_logo( self, diff --git a/templates/sponsors/new_sponsorship_application_form.html b/templates/sponsors/new_sponsorship_application_form.html index 9f7597650..1610807e8 100644 --- a/templates/sponsors/new_sponsorship_application_form.html +++ b/templates/sponsors/new_sponsorship_application_form.html @@ -2,15 +2,19 @@ {% load boxes widget_tweaks %} {% load humanize %} {% load sponsors %} +{% block page_title %}Sponsorship Information{% endblock %} -{% block page_title %}Submit Sponsorship Information{% endblock %} {% block content %}
    -

    Submit Sponsorship Information

    -
    +{% if sponsor %} +
    +

    Edit {{sponsor}}

    +
    +{% else %} +
    {% if sponsorship_package %}

    You selected the {{ sponsorship_package.name }} package {% if sponsorship_price %}costing ${{ sponsorship_price|intcomma }} USD {% endif %}and the following benefits: @@ -34,6 +38,10 @@

    Submit Sponsorship Information

    | Back to select benefits
    +

    Submit Sponsorship Information

    +{% endif %} + + {% if form.errors %} The form has one or more errors {{ form.non_field_errors }} @@ -53,6 +61,8 @@

    Submit Sponsorship Information

    +

    Basics

    +

    {% render_field form.name %} @@ -62,6 +72,33 @@

    Submit Sponsorship Information

    {% endif %}

    + +
    +
    +

    + + {% render_field form.country_of_incorporation %} + {% if form.country_of_incorporation.help_text %} +
    + {{ form.country_of_incorporation.help_text }} + {% endif %} +

    +
    + +
    +

    + + {% render_field form.state %} + {% if form.state_of_incorporation.help_text %} +
    + {{ form.state_of_incorporation.help_text }} + {% endif %} +

    +
    +
    +

    {% render_field form.description %} @@ -95,14 +132,39 @@

    Submit Sponsorship Information

    -

    - - {% render_field form.country %} - {% if form.country.help_text %} -
    - {{ form.country.help_text }} - {% endif %} -

    +
    +
    +

    + + {% render_field form.web_logo %} + {% if sponsor.web_logo %} +

    Currently: {{ sponsor.web_logo.name }}

    + {% endif %} + {% if form.web_logo.help_text %} +
    + {{ form.web_logo.help_text }} + {% endif %} +

    +
    + +
    +

    + + {% render_field form.print_logo %} + {% if sponsor.print_logo %} +

    Currently: {{ sponsor.print_logo.name }}

    + {% endif %} + {% if form.print_logo.help_text %} +
    + {{ form.print_logo.help_text }} + {% endif %} +

    +
    +
    + +
    + +

    Mailing and Contact

    @@ -167,11 +229,11 @@

    Submit Sponsorship Information

    - - {% render_field form.primary_phone %} - {% if form.primary_phone.help_text %} + + {% render_field form.country %} + {% if form.country.help_text %}
    - {{ form.primary_phone.help_text }} + {{ form.country.help_text }} {% endif %}

    @@ -179,25 +241,14 @@

    Submit Sponsorship Information

    -

    - - {% render_field form.web_logo %} - {% if form.web_logo.help_text %} -
    - {{ form.web_logo.help_text }} - {% endif %} -

    -
    - -
    -

    - - {% render_field form.print_logo %} - {% if form.print_logo.help_text %} -
    - {{ form.print_logo.help_text }} - {% endif %} -

    +

    + + {% render_field form.primary_phone %} + {% if form.primary_phone.help_text %} +
    + {{ form.primary_phone.help_text }} + {% endif %} +

    @@ -216,11 +267,16 @@

    Contacts

    - +{% if sponsor %} +
    + +
    + {% else %}
    + {% endif %}
    {% endblock content %} diff --git a/templates/users/sponsor_info_update.html b/templates/users/sponsor_info_update.html index 3ae2e720c..e1984a28c 100644 --- a/templates/users/sponsor_info_update.html +++ b/templates/users/sponsor_info_update.html @@ -17,6 +17,7 @@ {% block user_content %}

    Edit {{ sponsor }}

    +

    Basics

    {% if form.errors %} The form has one or more errors @@ -36,7 +37,31 @@

    Sponsor Information

    {% endif %} {% render_field form.name %}

    +
    +
    +

    + + {% render_field form.country_of_incorporation %} + {% if form.country_of_incorporation.help_text %} +
    + {{ form.country_of_incorporation.help_text }} + {% endif %} +

    +
    +
    +

    + + {% render_field form.state %} + {% if form.state_of_incorporation.help_text %} +
    + {{ form.state_of_incorporation.help_text }} + {% endif %} +

    +
    +

    @@ -69,16 +94,29 @@

    Sponsor Information

    - +
    +

    {% render_field form.country %} {% if form.country.help_text %} -
    {{ form.country.help_text }} {% endif %}

    +
    +
    +

    + + {% render_field form.country_of_incorporation %} + {% if form.country_of_incorporation.help_text %} +
    + {{ form.country_of_incorporation.help_text }} + {% endif %} +

    +
    +
    @@ -131,8 +169,19 @@

    Sponsor Information

    {{ form.state.help_text }} {% endif %}

    +
    +
    +

    + + {% render_field form.state %} + {% if form.state_of_incorporation.help_text %} +
    + {{ form.state_of_incorporation.help_text }} + {% endif %} +

    +
    -
    diff --git a/users/tests/test_views.py b/users/tests/test_views.py index 952425c98..13c226e5f 100644 --- a/users/tests/test_views.py +++ b/users/tests/test_views.py @@ -489,7 +489,7 @@ def test_display_template_with_sponsor_info(self): response = self.client.get(self.url) context = response.context - self.assertTemplateUsed(response, "users/sponsor_info_update.html") + self.assertTemplateUsed(response, "sponsors/new_sponsorship_application_form.html") self.assertEqual(context["sponsor"], self.sponsor) self.assertIsInstance(context["form"], SponsorUpdateForm) diff --git a/users/views.py b/users/views.py index 517c1419a..c56dbace4 100644 --- a/users/views.py +++ b/users/views.py @@ -264,7 +264,7 @@ def get_context_data(self, *args, **kwargs): @method_decorator(login_required(login_url=settings.LOGIN_URL), name="dispatch") class UpdateSponsorInfoView(UpdateView): object_name = "sponsor" - template_name = 'users/sponsor_info_update.html' + template_name = 'sponsors/new_sponsorship_application_form.html' form_class = SponsorUpdateForm def get_queryset(self): From 04751c86869f9653b65230a7e0028e7d3abd6009 Mon Sep 17 00:00:00 2001 From: Jessie <70440141+jessiebelle@users.noreply.github.com> Date: Mon, 15 Jan 2024 17:24:47 +0200 Subject: [PATCH 056/112] 2342 display only benefits associated with the year of the sponsorship package being edited (#2356) * WIP * WIP * WIP * we finally got there with the qs filter * removing redundant tests * removing unused imports * missed one --- sponsors/admin.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/sponsors/admin.py b/sponsors/admin.py index d6601140f..88aff8c57 100644 --- a/sponsors/admin.py +++ b/sponsors/admin.py @@ -246,9 +246,13 @@ def has_delete_permission(self, request, obj=None): return True return obj.open_for_editing - def get_queryset(self, *args, **kwargs): - qs = super().get_queryset(*args, **kwargs) - return qs.select_related("sponsorship_benefit__program", "program") + def get_queryset(self, request): + #filters the available benefits by the benefits for the year of the sponsorship + match = request.resolver_match + sponsorship = self.parent_model.objects.get(pk=match.kwargs["object_id"]) + year = sponsorship.year + + return super().get_queryset(request).filter(sponsorship_benefit__year=year) class TargetableEmailBenefitsFilter(admin.SimpleListFilter): From 0d5432a04dbfb78b582c808856f912b412b1201b Mon Sep 17 00:00:00 2001 From: Seth Michael Larson Date: Wed, 17 Jan 2024 13:18:02 -0600 Subject: [PATCH 057/112] Add support for hosting SPDX-2 SBOMs alongside release artifacts (#2359) --- downloads/api.py | 2 +- .../0010_releasefile_sbom_spdx2_file.py | 18 ++++++++++++++++++ downloads/models.py | 3 +++ downloads/serializers.py | 1 + downloads/templatetags/download_tags.py | 5 +++++ templates/downloads/release_detail.html | 7 +++++++ 6 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 downloads/migrations/0010_releasefile_sbom_spdx2_file.py diff --git a/downloads/api.py b/downloads/api.py index e58023dbf..73eb9b7bf 100644 --- a/downloads/api.py +++ b/downloads/api.py @@ -69,7 +69,7 @@ class Meta(GenericResource.Meta): 'creator', 'last_modified_by', 'os', 'release', 'description', 'is_source', 'url', 'gpg_signature_file', 'md5_sum', 'filesize', 'download_button', 'sigstore_signature_file', - 'sigstore_cert_file', 'sigstore_bundle_file', + 'sigstore_cert_file', 'sigstore_bundle_file', 'sbom_spdx2_file', ] filtering = { 'name': ('exact',), diff --git a/downloads/migrations/0010_releasefile_sbom_spdx2_file.py b/downloads/migrations/0010_releasefile_sbom_spdx2_file.py new file mode 100644 index 000000000..f3a4784e9 --- /dev/null +++ b/downloads/migrations/0010_releasefile_sbom_spdx2_file.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2024-01-12 21:04 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('downloads', '0009_releasefile_sigstore_bundle_file'), + ] + + operations = [ + migrations.AddField( + model_name='releasefile', + name='sbom_spdx2_file', + field=models.URLField(blank=True, help_text='SPDX-2 SBOM URL', verbose_name='SPDX-2 SBOM URL'), + ), + ] diff --git a/downloads/models.py b/downloads/models.py index 6d91534ac..4a9c5781c 100644 --- a/downloads/models.py +++ b/downloads/models.py @@ -332,6 +332,9 @@ class ReleaseFile(ContentManageable, NameSlugModel): sigstore_bundle_file = models.URLField( "Sigstore Bundle URL", blank=True, help_text="Sigstore Bundle URL" ) + sbom_spdx2_file = models.URLField( + "SPDX-2 SBOM URL", blank=True, help_text="SPDX-2 SBOM URL" + ) md5_sum = models.CharField('MD5 Sum', max_length=200, blank=True) filesize = models.IntegerField(default=0) download_button = models.BooleanField(default=False, help_text="Use for the supernav download button for this OS") diff --git a/downloads/serializers.py b/downloads/serializers.py index 67bde5b5c..1ff57049f 100644 --- a/downloads/serializers.py +++ b/downloads/serializers.py @@ -49,4 +49,5 @@ class Meta: 'sigstore_signature_file', 'sigstore_cert_file', 'sigstore_bundle_file', + 'sbom_spdx2_file', ) diff --git a/downloads/templatetags/download_tags.py b/downloads/templatetags/download_tags.py index fb3496787..57004ccb4 100644 --- a/downloads/templatetags/download_tags.py +++ b/downloads/templatetags/download_tags.py @@ -14,3 +14,8 @@ def has_sigstore_materials(files): f.sigstore_bundle_file or f.sigstore_cert_file or f.sigstore_signature_file for f in files ) + + +@register.filter +def has_sbom(files): + return any(f.sbom_spdx2_file for f in files) diff --git a/templates/downloads/release_detail.html b/templates/downloads/release_detail.html index b68b69a66..730b9b273 100644 --- a/templates/downloads/release_detail.html +++ b/templates/downloads/release_detail.html @@ -2,6 +2,7 @@ {% load boxes %} {% load sitetree %} {% load has_sigstore_materials from download_tags %} +{% load has_sbom from download_tags %} {% block body_attributes %}class="python downloads"{% endblock %} @@ -53,6 +54,9 @@

    Files

    {% if release_files|has_sigstore_materials %} Sigstore {% endif %} + {% if release_files|has_sbom %} + SBOM + {% endif %} @@ -72,6 +76,9 @@

    Files

    {% if f.sigstore_signature_file %}SIG{% endif %} {% endif %} {% endif %} + {% if release_files|has_sbom %} + {% if f.sbom_spdx2_file %}SPDX{% endif %} + {% endif %} {% endfor %} From cde08ed7a689d77ce2f723abd9b3681f1b2b3080 Mon Sep 17 00:00:00 2001 From: Seth Michael Larson Date: Wed, 7 Feb 2024 09:22:42 -0600 Subject: [PATCH 058/112] Link to SBOM user documentation from release detail page (#2363) --- templates/downloads/release_detail.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/downloads/release_detail.html b/templates/downloads/release_detail.html index 730b9b273..47ef47ce8 100644 --- a/templates/downloads/release_detail.html +++ b/templates/downloads/release_detail.html @@ -55,7 +55,7 @@

    Files

    Sigstore {% endif %} {% if release_files|has_sbom %} - SBOM + SBOM {% endif %} From 096ac337e1ccef8b2659699885a60b9c71d7fbd7 Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Fri, 9 Feb 2024 08:42:26 -0500 Subject: [PATCH 059/112] LinkedIn stuff (#2367) * Adds linkedin to socialize * Adds linkedin to sponsor profile Closes #2365 --- sponsors/forms.py | 6 ++++++ .../0101_sponsor_linked_in_page_url.py | 18 ++++++++++++++++++ sponsors/models/sponsors.py | 6 ++++++ static/sass/style.css | 17 +++++++++++++++++ static/sass/style.scss | 18 ++++++++++++++++++ templates/base.html | 7 ++++--- .../new_sponsorship_application_form.html | 11 +++++++++++ templates/users/sponsor_info_update.html | 12 ++++++++++++ 8 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 sponsors/migrations/0101_sponsor_linked_in_page_url.py diff --git a/sponsors/forms.py b/sponsors/forms.py index 21258f3b2..4ced017c9 100644 --- a/sponsors/forms.py +++ b/sponsors/forms.py @@ -221,6 +221,11 @@ class SponsorshipApplicationForm(forms.Form): help_text="For promotion of your sponsorship on social media.", required=False, ) + linked_in_page_url = forms.URLField( + label="LinkedIn page URL", + help_text="URL for your LinkedIn page.", + required=False, + ) web_logo = forms.ImageField( label="Sponsor web logo", help_text="For display on our sponsor webpage. High resolution PNG or JPG, smallest dimension no less than 256px", @@ -379,6 +384,7 @@ def save(self): description=self.cleaned_data.get("description", ""), landing_page_url=self.cleaned_data.get("landing_page_url", ""), twitter_handle=self.cleaned_data["twitter_handle"], + linked_in_page_url=self.cleaned_data["linked_in_page_url"], print_logo=self.cleaned_data.get("print_logo"), country_of_incorporation=self.cleaned_data.get("country_of_incorporation", ""), state_of_incorporation=self.cleaned_data.get("state_of_incorporation", ""), diff --git a/sponsors/migrations/0101_sponsor_linked_in_page_url.py b/sponsors/migrations/0101_sponsor_linked_in_page_url.py new file mode 100644 index 000000000..61041a08e --- /dev/null +++ b/sponsors/migrations/0101_sponsor_linked_in_page_url.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.24 on 2024-02-09 13:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('sponsors', '0100_auto_20240107_1054'), + ] + + operations = [ + migrations.AddField( + model_name='sponsor', + name='linked_in_page_url', + field=models.URLField(blank=True, help_text='URL for your LinkedIn page.', null=True, verbose_name='LinkedIn page URL'), + ), + ] diff --git a/sponsors/models/sponsors.py b/sponsors/models/sponsors.py index ba0cff83d..78d5d6e32 100644 --- a/sponsors/models/sponsors.py +++ b/sponsors/models/sponsors.py @@ -44,6 +44,12 @@ class Sponsor(ContentManageable): null=True, verbose_name="Twitter handle", ) + linked_in_page_url = models.URLField( + blank=True, + null=True, + verbose_name="LinkedIn page URL", + help_text="URL for your LinkedIn page." + ) web_logo = models.ImageField( upload_to="sponsor_web_logos", verbose_name="Web logo", diff --git a/static/sass/style.css b/static/sass/style.css index c3d2bb5f9..a58863817 100644 --- a/static/sass/style.css +++ b/static/sass/style.css @@ -3405,6 +3405,23 @@ span.highlighted { .icon-megaphone span, .icon-python-alt span, .icon-pypi span, .icon-news span, .icon-moderate span, .icon-mercurial span, .icon-jobs span, .icon-help span, .icon-download span, .icon-documentation span, .icon-community span, .icon-code span, .icon-close span, .icon-calendar span, .icon-beginner span, .icon-advanced span, .icon-sitemap span, .icon-search span, .icon-search-alt span, .icon-python span, .icon-github span, .icon-get-started span, .icon-feed span, .icon-facebook span, .icon-email span, .icon-arrow-up span, .icon-arrow-right span, .icon-arrow-left span, .icon-arrow-down span, .errorlist:before span, .icon-freenode span, .icon-alert span, .icon-versions span, .icon-twitter span, .icon-thumbs-up span, .icon-thumbs-down span, .icon-text-resize span, .icon-success-stories span, .icon-statistics span, .icon-stack-overflow span, .icon-mastodon span { display: none; } +.fa { + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + margin-right: .5em; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + /* Hide a unicode fallback character when we supply it by default. + * In fonts.scss, we hide the icon and show the fallback when other conditions are not met + */ } + .fa { + display: none; } + /* Keep this at the bottom since it will create a huge set of data */ /* * Would have liked to use Compass' built-in font-face mixin with the inline-font-files() helper, but it seems to be BROKEN in older versions! diff --git a/static/sass/style.scss b/static/sass/style.scss index 2e0ea8981..4fd9a3efd 100644 --- a/static/sass/style.scss +++ b/static/sass/style.scss @@ -2426,6 +2426,24 @@ span.highlighted { */ span { display: none; } } +.fa { + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + margin-right: .5em; + + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + + /* Hide a unicode fallback character when we supply it by default. + * In fonts.scss, we hide the icon and show the fallback when other conditions are not met + */ + span { display: none; } +} /* Keep this at the bottom since it will create a huge set of data */ @import "fonts"; diff --git a/templates/base.html b/templates/base.html index 27daceb50..cfa0f34ce 100644 --- a/templates/base.html +++ b/templates/base.html @@ -41,6 +41,7 @@ {% stylesheet 'style' %} {% stylesheet 'mq' %} + {% stylesheet 'font-awesome' %} {% comment %} {# equivalent to: #} @@ -235,10 +236,10 @@

  • Socialize
  • diff --git a/templates/sponsors/new_sponsorship_application_form.html b/templates/sponsors/new_sponsorship_application_form.html index 1610807e8..c95bdf4ea 100644 --- a/templates/sponsors/new_sponsorship_application_form.html +++ b/templates/sponsors/new_sponsorship_application_form.html @@ -130,6 +130,17 @@

    Basics

    {% endif %}

    + +
    +

    + + {% render_field form.linked_in_page_url%} + {% if form.linked_in_page_url.help_text %} +
    + {{ form.linked_in_page_url.help_text }} + {% endif %} +

    +
    diff --git a/templates/users/sponsor_info_update.html b/templates/users/sponsor_info_update.html index e1984a28c..1312fb782 100644 --- a/templates/users/sponsor_info_update.html +++ b/templates/users/sponsor_info_update.html @@ -93,6 +93,18 @@

    Sponsor Information

    {% endif %}

    + +
    +

    + + {% render_field form.linked_in_page_url%} + {% if form.linked_in_page_url.help_text %} +
    + {{ form.linked_in_page_url.help_text }} + {% endif %} +

    +
    From 8f37034ec1399af8d42a2291c4053e81ea82c39a Mon Sep 17 00:00:00 2001 From: Jon Clements Date: Wed, 14 Feb 2024 11:22:33 +0000 Subject: [PATCH 060/112] Update job_detail.html (#2298) Explicity escape the job description for the meta og:description where the description contains html which can throw off the rendering of the page... See https://www.python.org/jobs/7314/ for example. --- templates/jobs/job_detail.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/jobs/job_detail.html b/templates/jobs/job_detail.html index 82ddd3f58..be073e551 100644 --- a/templates/jobs/job_detail.html +++ b/templates/jobs/job_detail.html @@ -8,7 +8,7 @@ {% block content_attributes %}with-right-sidebar{% endblock %} {% block og_title %}Job: {{ object.job_title }} at {{ object.company_name }}{% endblock %} -{% block og-descript %}{{ object.description|truncatechars:200 }}{% endblock %} +{% block og-descript %}{{ object.description|escape|truncatechars:200 }}{% endblock %} {% block content %} {% load companies %} From bd3f080dbe3f4b53c0f5464b269917ec34754beb Mon Sep 17 00:00:00 2001 From: cfsok <33849525+cfsok@users.noreply.github.com> Date: Wed, 21 Feb 2024 22:53:37 +0900 Subject: [PATCH 061/112] Add DearPyGui to home page (#2362) --- fixtures/boxes.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fixtures/boxes.json b/fixtures/boxes.json index b0e965011..bc3816cc7 100644 --- a/fixtures/boxes.json +++ b/fixtures/boxes.json @@ -174,9 +174,9 @@ "created": "2013-10-28T19:27:20.963Z", "updated": "2022-01-05T15:42:59.645Z", "label": "widget-use-python-for", - "content": "

    Use Python for…

    \r\n

    More

    \r\n\r\n", + "content": "

    Use Python for…

    \r\n

    More

    \r\n\r\n", "content_markup_type": "html", - "_content_rendered": "

    Use Python for…

    \r\n

    More

    \r\n\r\n" + "_content_rendered": "

    Use Python for…

    \r\n

    More

    \r\n\r\n" } }, { From c1b800bc490b770f7cf2ec50d7820c96607dbb8e Mon Sep 17 00:00:00 2001 From: Noelle Leigh <5957867+noelleleigh@users.noreply.github.com> Date: Wed, 21 Feb 2024 08:54:30 -0500 Subject: [PATCH 062/112] `download:download_release_detail` view: Display file sizes with human-readable units (#2354) Make the release file sizes more readable by passing them through the [filesizeformat filter][1]. [1]: https://docs.djangoproject.com/en/2.2/ref/templates/builtins/#filesizeformat --- downloads/tests/base.py | 1 + downloads/tests/test_views.py | 3 +++ templates/downloads/release_detail.html | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/downloads/tests/base.py b/downloads/tests/base.py index e19ffe03a..bcb7905c4 100644 --- a/downloads/tests/base.py +++ b/downloads/tests/base.py @@ -64,6 +64,7 @@ def setUp(self): is_source=True, description='Gzipped source', url='ftp/python/2.7.5/Python-2.7.5.tgz', + filesize=12345678, ) self.draft_release = Release.objects.create( diff --git a/downloads/tests/test_views.py b/downloads/tests/test_views.py index 75fe76693..50270c556 100644 --- a/downloads/tests/test_views.py +++ b/downloads/tests/test_views.py @@ -40,6 +40,9 @@ def test_download_release_detail(self): response = self.client.get(url) self.assertEqual(response.status_code, 200) + with self.subTest("Release file sizes should be human-readable"): + self.assertInHTML("11.8 MB", response.content.decode()) + url = reverse('download:download_release_detail', kwargs={'release_slug': 'fake_slug'}) response = self.client.get(url) self.assertEqual(response.status_code, 404) diff --git a/templates/downloads/release_detail.html b/templates/downloads/release_detail.html index 47ef47ce8..59ffe2d7a 100644 --- a/templates/downloads/release_detail.html +++ b/templates/downloads/release_detail.html @@ -66,7 +66,7 @@

    Files

    {{ f.os.name }} {{ f.description }} {{ f.md5_sum }} - {{ f.filesize }} + {{ f.filesize|filesizeformat }} {% if f.gpg_signature_file %}SIG{% endif %} {% if release_files|has_sigstore_materials %} {% if f.sigstore_bundle_file %} From a4990b711ccd6e34e87d8d4b97169846fba5414f Mon Sep 17 00:00:00 2001 From: Ee Durbin Date: Wed, 21 Feb 2024 08:55:08 -0500 Subject: [PATCH 063/112] Move to pandoc for rendering sponsorship contracts (#2343) * Move to pandoc for rendering sponsorship contracts * use renewal template if applicable * consistency * formatting tweaks * bit cleaner names for files * grinding out formatting --- .github/workflows/ci.yml | 12 + Aptfile | 0 Dockerfile | 42 ++- base-requirements.txt | 7 +- pydotorg/settings/base.py | 1 - sponsors/contracts.py | 89 ++++++ sponsors/pandoc_filters/__init__.py | 0 sponsors/pandoc_filters/pagebreak.py | 90 ++++++ sponsors/pdf.py | 78 ----- sponsors/reference.docx | Bin 0 -> 12636 bytes sponsors/tests/test_contracts.py | 39 +++ sponsors/tests/test_pdf.py | 113 ------- sponsors/use_cases.py | 2 +- sponsors/views_admin.py | 2 +- .../sponsors/admin/contract-template.docx | Bin 15199 -> 0 bytes .../admin/contracts/renewal-agreement.md | 119 ++++++++ .../admin/contracts/sponsorship-agreement.md | 209 +++++++++++++ .../sponsors/admin/preview-contract.html | 283 ------------------ .../admin/renewal-contract-template.docx | Bin 9323 -> 0 bytes texlive.packages | 2 + 20 files changed, 605 insertions(+), 483 deletions(-) create mode 100644 Aptfile create mode 100644 sponsors/contracts.py create mode 100644 sponsors/pandoc_filters/__init__.py create mode 100644 sponsors/pandoc_filters/pagebreak.py delete mode 100644 sponsors/pdf.py create mode 100644 sponsors/reference.docx create mode 100644 sponsors/tests/test_contracts.py delete mode 100644 sponsors/tests/test_pdf.py delete mode 100644 templates/sponsors/admin/contract-template.docx create mode 100644 templates/sponsors/admin/contracts/renewal-agreement.md create mode 100644 templates/sponsors/admin/contracts/sponsorship-agreement.md delete mode 100644 templates/sponsors/admin/preview-contract.html delete mode 100644 templates/sponsors/admin/renewal-contract-template.docx create mode 100644 texlive.packages diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 97298ffca..28bfcc5ee 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,6 +17,18 @@ jobs: steps: - name: Check out repository uses: actions/checkout@v2 + - name: Install platform dependencies + run: | + sudo apt -y update + sudo apt -y install --no-install-recommends \ + texlive-latex-base \ + texlive-latex-recommended \ + texlive-plain-generic \ + lmodern + - name: Install pandoc + run: | + wget https://github.com/jgm/pandoc/releases/download/2.17.1.1/pandoc-2.17.1.1-1-amd64.deb + sudo dpkg -i pandoc-2.17.1.1-1-amd64.deb - uses: actions/setup-python@v2 with: python-version: 3.9.16 diff --git a/Aptfile b/Aptfile new file mode 100644 index 000000000..e69de29bb diff --git a/Dockerfile b/Dockerfile index 4d1046a98..f8aca13a2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,47 @@ -FROM python:3.9-bullseye +FROM python:3.9-bookworm ENV PYTHONUNBUFFERED=1 ENV PYTHONDONTWRITEBYTECODE=1 + +# By default, Docker has special steps to avoid keeping APT caches in the layers, which +# is good, but in our case, we're going to mount a special cache volume (kept between +# builds), so we WANT the cache to persist. +RUN set -eux; \ + rm -f /etc/apt/apt.conf.d/docker-clean; \ + echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache; + +# Install System level build requirements, this is done before +# everything else because these are rarely ever going to change. +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt,sharing=locked \ + set -x \ + && apt-get update \ + && apt-get install --no-install-recommends -y \ + pandoc \ + texlive-latex-base \ + texlive-latex-recommended \ + texlive-fonts-recommended \ + texlive-plain-generic \ + lmodern + +RUN case $(uname -m) in \ + "x86_64") ARCH=amd64 ;; \ + "aarch64") ARCH=arm64 ;; \ + esac \ + && wget --quiet https://github.com/jgm/pandoc/releases/download/2.17.1.1/pandoc-2.17.1.1-1-${ARCH}.deb \ + && dpkg -i pandoc-2.17.1.1-1-${ARCH}.deb + RUN mkdir /code WORKDIR /code + COPY dev-requirements.txt /code/ COPY base-requirements.txt /code/ -RUN pip install -r dev-requirements.txt + +RUN pip --no-cache-dir --disable-pip-version-check install --upgrade pip setuptools wheel + +RUN --mount=type=cache,target=/root/.cache/pip \ + set -x \ + && pip --disable-pip-version-check \ + install \ + -r dev-requirements.txt + COPY . /code/ diff --git a/base-requirements.txt b/base-requirements.txt index 9ddabf236..2495153db 100644 --- a/base-requirements.txt +++ b/base-requirements.txt @@ -44,12 +44,11 @@ django-filter==2.4.0 django-ordered-model==3.4.3 django-widget-tweaks==1.4.8 django-countries==7.2.1 -xhtml2pdf==0.2.5 -django-easy-pdf3==0.1.2 num2words==0.5.10 django-polymorphic==3.0.0 sorl-thumbnail==12.7.0 -docxtpl==0.12.0 -reportlab==3.6.6 django-extensions==3.1.4 django-import-export==2.7.1 + +pypandoc==1.12 +panflute==2.3.0 diff --git a/pydotorg/settings/base.py b/pydotorg/settings/base.py index 25874dd5d..ccbf3acab 100644 --- a/pydotorg/settings/base.py +++ b/pydotorg/settings/base.py @@ -173,7 +173,6 @@ 'ordered_model', 'widget_tweaks', 'django_countries', - 'easy_pdf', 'sorl.thumbnail', 'banners', diff --git a/sponsors/contracts.py b/sponsors/contracts.py new file mode 100644 index 000000000..7e72cde39 --- /dev/null +++ b/sponsors/contracts.py @@ -0,0 +1,89 @@ +import os +import tempfile + +from django.http import HttpResponse +from django.template.loader import render_to_string +from django.utils.dateformat import format + +import pypandoc + +dirname = os.path.dirname(__file__) +DOCXPAGEBREAK_FILTER = os.path.join(dirname, "pandoc_filters/pagebreak.py") +REFERENCE_DOCX = os.path.join(dirname, "reference.docx") + + +def _clean_split(text, separator="\n"): + return [ + t.replace("-", "").strip() + for t in text.split("\n") + if t.replace("-", "").strip() + ] + + +def _contract_context(contract, **context): + start_date = contract.sponsorship.start_date + context.update( + { + "contract": contract, + "start_date": start_date, + "start_day_english_suffix": format(start_date, "S"), + "sponsor": contract.sponsorship.sponsor, + "sponsorship": contract.sponsorship, + "benefits": _clean_split(contract.benefits_list.raw), + "legal_clauses": _clean_split(contract.legal_clauses.raw), + } + ) + previous_effective = contract.sponsorship.previous_effective_date + context["previous_effective"] = previous_effective if previous_effective else "UNKNOWN" + context["previous_effective_english_suffix"] = format(previous_effective, "S") if previous_effective else "UNKNOWN" + return context + + +def render_markdown_from_template(contract, **context): + template = "sponsors/admin/contracts/sponsorship-agreement.md" + if contract.sponsorship.renewal: + template = "sponsors/admin/contracts/renewal-agreement.md" + context = _contract_context(contract, **context) + return render_to_string(template, context) + + +def render_contract_to_pdf_response(request, contract, **context): + response = HttpResponse( + render_contract_to_pdf_file(contract, **context), content_type="application/pdf" + ) + return response + + +def render_contract_to_pdf_file(contract, **context): + with tempfile.NamedTemporaryFile() as docx_file: + with tempfile.NamedTemporaryFile(suffix=".pdf") as pdf_file: + markdown = render_markdown_from_template(contract, **context) + pdf = pypandoc.convert_text( + markdown, "pdf", outputfile=pdf_file.name, format="md" + ) + return pdf_file.read() + + +def render_contract_to_docx_response(request, contract, **context): + response = HttpResponse( + render_contract_to_docx_file(contract, **context), + content_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document", + ) + response[ + "Content-Disposition" + ] = f"attachment; filename={'sponsorship-renewal' if contract.sponsorship.renewal else 'sponsorship-contract'}-{contract.sponsorship.sponsor.name.replace(' ', '-').replace('.', '')}.docx" + return response + + +def render_contract_to_docx_file(contract, **context): + markdown = render_markdown_from_template(contract, **context) + with tempfile.NamedTemporaryFile() as docx_file: + docx = pypandoc.convert_text( + markdown, + "docx", + outputfile=docx_file.name, + format="md", + filters=[DOCXPAGEBREAK_FILTER], + extra_args=[f"--reference-doc", REFERENCE_DOCX], + ) + return docx_file.read() diff --git a/sponsors/pandoc_filters/__init__.py b/sponsors/pandoc_filters/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sponsors/pandoc_filters/pagebreak.py b/sponsors/pandoc_filters/pagebreak.py new file mode 100644 index 000000000..525b89c57 --- /dev/null +++ b/sponsors/pandoc_filters/pagebreak.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +# ------------------------------------------------------------------------------ +# Source: https://github.com/pandocker/pandoc-docx-pagebreak-py/ +# Revision: c8cddccebb78af75168da000a3d6ac09349bef73 +# ------------------------------------------------------------------------------ +# MIT License +# +# Copyright (c) 2018 pandocker +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# ------------------------------------------------------------------------------ + +""" pandoc-docx-pagebreakpy +Pandoc filter to insert pagebreak as openxml RawBlock +Only for docx output + +Trying to port pandoc-doc-pagebreak +- https://github.com/alexstoick/pandoc-docx-pagebreak +""" + +import panflute as pf + + +class DocxPagebreak(object): + pagebreak = pf.RawBlock("", format="openxml") + sectionbreak = pf.RawBlock("", + format="openxml") + toc = pf.RawBlock(r""" + + + + + + TOC \o "1-3" \h \z \u + + + + + + +""", format="openxml") + + def action(self, elem, doc): + if isinstance(elem, pf.RawBlock): + if elem.text == r"\newpage": + if (doc.format == "docx"): + pf.debug("Page Break") + elem = self.pagebreak + # elif elem.text == r"\newsection": + # if (doc.format == "docx"): + # pf.debug("Section Break") + # elem = self.sectionbreak + # else: + # elem = [] + elif elem.text == r"\toc": + if (doc.format == "docx"): + pf.debug("Table of Contents") + para = [pf.Para(pf.Str("Table"), pf.Space(), pf.Str("of"), pf.Space(), pf.Str("Contents"))] + div = pf.Div(*para, attributes={"custom-style": "TOC Heading"}) + elem = [div, self.toc] + else: + elem = [] + return elem + + +def main(doc=None): + dp = DocxPagebreak() + return pf.run_filter(dp.action, doc=doc) + + +if __name__ == "__main__": + main() diff --git a/sponsors/pdf.py b/sponsors/pdf.py deleted file mode 100644 index 9855beee3..000000000 --- a/sponsors/pdf.py +++ /dev/null @@ -1,78 +0,0 @@ -""" -This module is a wrapper around django-easy-pdf so we can reuse code -""" -import io -import os -from django.conf import settings -from django.http import HttpResponse -from django.utils.dateformat import format - -from docxtpl import DocxTemplate -from easy_pdf.rendering import render_to_pdf_response, render_to_pdf - -from markupfield_helpers.helpers import render_md -from django.utils.html import mark_safe - - -def _clean_split(text, separator='\n'): - return [ - t.replace('-', '').strip() - for t in text.split('\n') - if t.replace('-', '').strip() - ] - - -def _contract_context(contract, **context): - start_date = contract.sponsorship.start_date - context.update({ - "contract": contract, - "start_date": start_date, - "start_day_english_suffix": format(start_date, "S"), - "sponsor": contract.sponsorship.sponsor, - "sponsorship": contract.sponsorship, - "benefits": _clean_split(contract.benefits_list.raw), - "legal_clauses": _clean_split(contract.legal_clauses.raw), - "renewal": contract.sponsorship.renewal, - }) - previous_effective = contract.sponsorship.previous_effective_date - context["previous_effective"] = previous_effective if previous_effective else "UNKNOWN" - context["previous_effective_english_suffix"] = format(previous_effective, "S") if previous_effective else None - return context - - -def render_contract_to_pdf_response(request, contract, **context): - template = "sponsors/admin/preview-contract.html" - context = _contract_context(contract, **context) - return render_to_pdf_response(request, template, context) - - -def render_contract_to_pdf_file(contract, **context): - template = "sponsors/admin/preview-contract.html" - context = _contract_context(contract, **context) - return render_to_pdf(template, context) - - -def _gen_docx_contract(output, contract, **context): - context = _contract_context(contract, **context) - renewal = context["renewal"] - if renewal: - template = os.path.join(settings.TEMPLATES_DIR, "sponsors", "admin", "renewal-contract-template.docx") - else: - template = os.path.join(settings.TEMPLATES_DIR, "sponsors", "admin", "contract-template.docx") - doc = DocxTemplate(template) - doc.render(context) - doc.save(output) - return output - - -def render_contract_to_docx_response(request, contract, **context): - response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document') - response['Content-Disposition'] = 'attachment; filename=contract.docx' - return _gen_docx_contract(output=response, contract=contract, **context) - - -def render_contract_to_docx_file(contract, **context): - fp = io.BytesIO() - fp = _gen_docx_contract(output=fp, contract=contract, **context) - fp.seek(0) - return fp.read() diff --git a/sponsors/reference.docx b/sponsors/reference.docx new file mode 100644 index 0000000000000000000000000000000000000000..bf094ca4f3f29b535da99c765b735eaee71420d1 GIT binary patch literal 12636 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%0D(b%B@_FB(DPPG z&0-g(r3Rwn9F|ya1EjZf5p!cs^V5e5ZrET>?rO&LZgV<8>y|PaqQ=B8^hbNN#5@lG z0asUMKV77q?P6^*ryGXhe|7wL{4^-TYsU*g{?my6?{RnDL<%&%Rsewdqhdk#28DJ-dJc@MXwm#QOhEI1QdJ= zw+08&iV{+vYD)Ju&N{VUf0P7KmtpWi7ursN&SVQ)f$~RDk1=CqiBf_jvQG~b*O=CK zV3KAQLC4&IfxT~*kvnG%bXdDXpTFaQ-8)tQLGU>*qRLSx*I9R^xi-j4EM;a@4fV_M z=;yL$-Whpw-}3U2q)2lT2nm~`#`MbwIa^}|*lDs`in=xFY-z+XKz5-;T8E>9rKX#g z>-^fmKz7f25wC!%-DGwc6lQ)iXrmfORRo5Eedxs1pSC5{%MOX=wWp!}ubewA;a7+K zx@V-P>}F@;sPoecw@6#F=%S?N!;BwtzIKqtH5W3uX-;nT zlewkvbhrB8XW({gOBU!eI)sOecHd@EhQfxQ&jpbg?wV{`kxqv7J#0Tsi zhakfr$2j}4mb2PWz>AYFt;4HLx36?bs(bBRS4YEs(Ep8C4^55|`XO7b1`U=B- zMjiO^A(Kjq%7+I}B!-|f6P_}{B((Rd0>$Rn5#KY0O*l4aU7y1YX(UsB%r)M08I|3M z`dB?YzXhVZON#HBu7PLuMGVnIKU_AV>8XR-@@=~p^3WTA{0}L0m_50C<_`=PKSVZV zTWzKh2qZ=`^sPMGQD6qlt_e??PMEAqxP`lEo_9UY3Fka{ynMv%8SFvWM^j^U!T-l#<8{R#hl jTK;_ySJ8lg{2wf=ycFc?@B#rre*HCrzeXZ-Kd=55B-B^E literal 0 HcmV?d00001 diff --git a/sponsors/tests/test_contracts.py b/sponsors/tests/test_contracts.py new file mode 100644 index 000000000..c330c13a8 --- /dev/null +++ b/sponsors/tests/test_contracts.py @@ -0,0 +1,39 @@ +from datetime import date +from model_bakery import baker +from unittest.mock import patch, Mock + +from django.http import HttpRequest +from django.test import TestCase +from django.utils.dateformat import format + +from sponsors.contracts import render_contract_to_docx_response + + +class TestRenderContract(TestCase): + def setUp(self): + self.contract = baker.make_recipe("sponsors.tests.empty_contract", sponsorship__start_date=date.today()) + + # DOCX unit test + def test_render_response_with_docx_attachment(self): + request = Mock(HttpRequest) + self.contract.sponsorship.renewal = False + response = render_contract_to_docx_response(request, self.contract) + + self.assertEqual(response.get("Content-Disposition"), "attachment; filename=sponsorship-contract-Sponsor.docx") + self.assertEqual( + response.get("Content-Type"), + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + ) + + + # DOCX unit test + def test_render_renewal_response_with_docx_attachment(self): + request = Mock(HttpRequest) + self.contract.sponsorship.renewal = True + response = render_contract_to_docx_response(request, self.contract) + + self.assertEqual(response.get("Content-Disposition"), "attachment; filename=sponsorship-renewal-Sponsor.docx") + self.assertEqual( + response.get("Content-Type"), + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + ) diff --git a/sponsors/tests/test_pdf.py b/sponsors/tests/test_pdf.py deleted file mode 100644 index e4d140cf2..000000000 --- a/sponsors/tests/test_pdf.py +++ /dev/null @@ -1,113 +0,0 @@ -from datetime import date -from docxtpl import DocxTemplate -from markupfield_helpers.helpers import render_md -from model_bakery import baker -from pathlib import Path -from unittest.mock import patch, Mock - -from django.conf import settings -from django.http import HttpResponse, HttpRequest -from django.template.loader import render_to_string -from django.test import TestCase -from django.utils.html import mark_safe -from django.utils.dateformat import format - -from sponsors.pdf import render_contract_to_pdf_file, render_contract_to_pdf_response, render_contract_to_docx_response - - -class TestRenderContract(TestCase): - def setUp(self): - self.contract = baker.make_recipe("sponsors.tests.empty_contract", sponsorship__start_date=date.today()) - text = f"{self.contract.benefits_list.raw}\n\n**Legal Clauses**\n{self.contract.legal_clauses.raw}" - html = render_md(text) - self.context = { - "contract": self.contract, - "start_date": self.contract.sponsorship.start_date, - "start_day_english_suffix": format(self.contract.sponsorship.start_date, "S"), - "sponsor": self.contract.sponsorship.sponsor, - "sponsorship": self.contract.sponsorship, - "benefits": [], - "legal_clauses": [], - "renewal": None, - "previous_effective": "UNKNOWN", - "previous_effective_english_suffix": None, - } - self.template = "sponsors/admin/preview-contract.html" - - # PDF unit tests - @patch("sponsors.pdf.render_to_pdf") - def test_render_pdf_using_django_easy_pdf(self, mock_render): - mock_render.return_value = "pdf content" - - content = render_contract_to_pdf_file(self.contract) - - self.assertEqual(content, "pdf content") - mock_render.assert_called_once_with(self.template, self.context) - - @patch("sponsors.pdf.render_to_pdf_response") - def test_render_response_using_django_easy_pdf(self, mock_render): - response = Mock(HttpResponse) - mock_render.return_value = response - - request = Mock(HttpRequest) - content = render_contract_to_pdf_response(request, self.contract) - - self.assertEqual(content, response) - mock_render.assert_called_once_with(request, self.template, self.context) - - # DOCX unit test - @patch("sponsors.pdf.DocxTemplate") - def test_render_response_with_docx_attachment(self, MockDocxTemplate): - template = Path(settings.TEMPLATES_DIR) / "sponsors" / "admin" / "contract-template.docx" - self.assertTrue(template.exists()) - mocked_doc = Mock(DocxTemplate) - MockDocxTemplate.return_value = mocked_doc - - request = Mock(HttpRequest) - response = render_contract_to_docx_response(request, self.contract) - - MockDocxTemplate.assert_called_once_with(str(template.resolve())) - mocked_doc.render.assert_called_once_with(self.context) - mocked_doc.save.assert_called_once_with(response) - self.assertEqual(response.get("Content-Disposition"), "attachment; filename=contract.docx") - self.assertEqual( - response.get("Content-Type"), - "application/vnd.openxmlformats-officedocument.wordprocessingml.document" - ) - - @patch("sponsors.pdf.DocxTemplate") - def test_render_response_with_docx_attachment__renewal(self, MockDocxTemplate): - renewal_contract = baker.make_recipe("sponsors.tests.empty_contract", sponsorship__start_date=date.today(), - sponsorship__renewal=True) - text = f"{renewal_contract.benefits_list.raw}\n\n**Legal Clauses**\n{renewal_contract.legal_clauses.raw}" - html = render_md(text) - renewal_context = { - "contract": renewal_contract, - "start_date": renewal_contract.sponsorship.start_date, - "start_day_english_suffix": format(self.contract.sponsorship.start_date, "S"), - "sponsor": renewal_contract.sponsorship.sponsor, - "sponsorship": renewal_contract.sponsorship, - "benefits": [], - "legal_clauses": [], - "renewal": True, - "previous_effective": "UNKNOWN", - "previous_effective_english_suffix": None, - } - renewal_template = "sponsors/admin/preview-contract.html" - - template = Path(settings.TEMPLATES_DIR) / "sponsors" / "admin" / "renewal-contract-template.docx" - self.assertTrue(template.exists()) - mocked_doc = Mock(DocxTemplate) - MockDocxTemplate.return_value = mocked_doc - - request = Mock(HttpRequest) - response = render_contract_to_docx_response(request, renewal_contract) - - MockDocxTemplate.assert_called_once_with(str(template.resolve())) - mocked_doc.render.assert_called_once_with(renewal_context) - mocked_doc.save.assert_called_once_with(response) - self.assertEqual(response.get("Content-Disposition"), "attachment; filename=contract.docx") - self.assertEqual( - response.get("Content-Type"), - "application/vnd.openxmlformats-officedocument.wordprocessingml.document" - ) diff --git a/sponsors/use_cases.py b/sponsors/use_cases.py index bbb6f2483..91271ff64 100644 --- a/sponsors/use_cases.py +++ b/sponsors/use_cases.py @@ -3,7 +3,7 @@ from sponsors import notifications from sponsors.models import Sponsorship, Contract, SponsorContact, SponsorEmailNotificationTemplate, SponsorshipBenefit, \ SponsorshipPackage -from sponsors.pdf import render_contract_to_pdf_file, render_contract_to_docx_file +from sponsors.contracts import render_contract_to_pdf_file, render_contract_to_docx_file class BaseUseCaseWithNotifications: diff --git a/sponsors/views_admin.py b/sponsors/views_admin.py index e9a808ccc..fd8631d3f 100644 --- a/sponsors/views_admin.py +++ b/sponsors/views_admin.py @@ -14,7 +14,7 @@ from sponsors.forms import SponsorshipReviewAdminForm, SponsorshipsListForm, SignedSponsorshipReviewAdminForm, \ SendSponsorshipNotificationForm, CloneApplicationConfigForm from sponsors.exceptions import InvalidStatusException -from sponsors.pdf import render_contract_to_pdf_response, render_contract_to_docx_response +from sponsors.contracts import render_contract_to_pdf_response, render_contract_to_docx_response from sponsors.models import Sponsorship, SponsorBenefit, EmailTargetable, SponsorContact, BenefitFeature, \ SponsorshipCurrentYear, SponsorshipBenefit, SponsorshipPackage diff --git a/templates/sponsors/admin/contract-template.docx b/templates/sponsors/admin/contract-template.docx deleted file mode 100644 index 5bdc44525a4d15367bcaad989f5d63ba6c278233..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15199 zcmaL819&Cdwl*Bwwr$(CZQHidv7L0BbZpyp$4SSwoqXN#4PB)v8ge z=6DC@Q**ou(!d}n01yxm02P_B>HvQe=->PLPNp`_^mKpTtLFQpfEf|Mw!L$WGQ8cJ zRYgo1y1vb3N%#iDPhNs$$w-uFZT(V!YFAL}!()CqIwCIG#QEs(ASEeQN9smu<1ox2P!=xjiJIW*uby{$~)f#7n#c1+e0N!c0 zykz(|53rlpw5Fnzj!KJtPal%xea=bJh7Zj+p+xH^lY~)QHWfM5fm9JZo(n*|?$IK$j-SxY^u>#(> znM~2Bq})|sKm}=Vhy$lbk>lUPp9KN{Q20L$g!uam6MJI?Cwm8HdSiPhQ#ub@8(*af zxd8@*&O6kEtFpZ!(Uip!B|%FdC-#OG*f0Y&K)X4e>4x`;V759?c4w6$5l z+KLneAhB>wfyHLDK(yN{;IR&cG^u#7TB$BZ^?V)5(J!Cg`uHr1y8XqrQsHN&e&o+T zl#|4}I9Y{ALjw`QcLLf^xK3I-x#!YKV2LwA7dnm(V;cJmdNBFq&gx%T53p6+Xf>E` z@8M)Oj_36lN`Fdt=sej!x_pCUYFkt^Cvb#N(&Rh2v)Px}Q(bpj!#vGX^T!Y)QxUOt?(XUr22u zZa-TC0sw6MN2Cz`j+CK;!ylk>6esNZe*^VIUGPJFmt#L7T5++wRE>ZY)NYg`OFU&I z^@8a64Xa>2`)px)+RF^z#1+r$3S`YiiN+Tvq#HbFq8xc@{)#Bz{CR@m^rX8)Yz&F+zj_8Y@+L?qesHKH-MocN*HBO z1E``PtFpVGzlu)wxxXm&Sj|UVqjez|h@KM0bhr$*0`Y zmFtkcXR%mI?8wQWj`1MRH#s*CBcHW13&L35Ns+->yU?wopzwDvBa$xJ=p08JgQBW} zj+K}*i5%0KQ+vjViy*RH)x+yIXei`@$G@t!*~Qr^0fm`^h6B!vs$pWFbP!mE_uEV} z9nbs}vZsmJS4fx*-E(aDQTF7(I?(PcH$$9LGg&jsmS%anv9|JopR(rg{{#-Jgc7CV zZ#X3XBOJ(ohr`&_*~Q-WFGQy6p!yk5LU%SxAy(H_z!T;hqd2%#p5lKs13KG}%0~Hm z69-+!hU4?eE%1H_S0bz;TD8$rQv%S!!jaS3e-v{__Kj^D;DzKJfYEfgE$a}2ej5Xf zq9L&6EJd*@UYXv8P2)7CBNnw+`tGR25mip|^9jH8ORwv@`!Rtc%P| zt91sHk*g;Z!P+QYmQS0^P%cvjC|qNhCEkF7(TEJbXcF>^3q7m2CiQfhb;+*A@)jsF zczw#HInLWF`n`9~=iAfR#4$MN49C;}gVSJ0vu`!b&62&#>t_v|=@Ou;SV+?jK$mqO z>J#c|Z=lr2P|#g=1=0*{E93?hD&5yS5zXmBoClm{T&Yfi`SWQ;dlzjQM?u6i#nVND z(7yhMis_6BX*-Y^0tJ+dC1WGwi z*rraDtW7t6#U`5Jit08OEBH{~GO;gfS1~1)c{g|}o8b?VyTWou|-3-61^I@5Z3-20a90j{PwdnNKQ+g-P*U?4006_clDf`Ag; zbK=ye=ETq`Mp2BgOo;0aZ41{ZX}Rwn;W;4FGDulf_9$1Blfsw%VWn~|3*dwMhzSrq zU!U$N7Mi(vsjprRbrD^AlW4%Lo#h5YK1sHE+J|Ime&NVGZ$TY3$s9Mpv7YZLR4gy#YW)0~%Gc5q zMz8c`Dpgw>g{(q$KOI)ovNR@dl%pxe#DS_bep0Gg8PccNQ%3Nol>fXzPn| ze4gE8qVP*R;rX<5K7szkmlrT=GXXFFz$?XnimyKf_pkW+U3Fb;P3>I%3NPIkI~2*x zFaKPkeOk(sa~;ZeBNtR|$A`a5G=z#F~_pFNNhUuQ6Lk(loNg@|iUnTW+CY zPHTWsuPsMRm$F=!D|fW;*Qhr*Kd!G;%*|Zp$Xjolt@d)PabuMXkNW{-gYY79@Bq?Q z^MZw)W_d(@nce%>(0n*&$|IAKc^@%(Ho8SCr&ZeSW+17Z68R}AtO#FXw5uU$w66RhqSGHp^jU!+uZEK_XU+Mz25k?~a+`%uL4TjLr((JbK?2Ra@p0!P}`*etOZ~3^m zaMH86Kz&0o1012!EqW+yQZ{`E;Ooq7zh#Hd{rc*?8TE(LZ^t~`JpyL;zL>|8eY_nh ztx}hKdjl>IH@=xvjWqy)qp5MF`ZdlGp_p{m)x4^=a(?{@sQ?! z4qv5Yq4DuL!N1O5h%Lk|NF_WZRN97UkQP}NouUvN80q9&9pcgt10whF_GHky_AX1~ z+;rf?J^G+gHSoiJkYOVxD(W=w1Um%|`9jQI2XO6ea|o2JzBBO3Yj;?`EkRY|aKOp! zd#{3;ag}!gfAPabg-?MBm7eTfg5(fox+bz^iiZ`{wbU%UMkuL=>#K|Ep>8Dkw!s`u zDH*7=SDrH>W>(-q=g%c-<@Z4|`L3x;6eMqpqPOC>EdbhITF& z9Yi3ATb;n#>V%tAj^sHC3g~TlB5QuJz@Pj;qJ_##qan=3p}SjwyAcmsbYey+NZF2$h{GfDPGLYH8bxPuPz$keJ;n<~G1R5*(tedO14z~o*S z=*r?(-`wgyaV(7O^v$h)MlGO8rgm?3U#hr%1k=>y;(y1vY>B8$T>X_Fxy$~9R=zJ#yBiA(t901}Er<%gjq2*k!#nhTsaCQ>*iSp#2{ zv2S821=w6zKMU$3Q>Y?UR>}luY|cZclp}xBmqFi8O}(@4LBSinOV z=4Dy*fp!r9rG(0fpI|Ce=XT5)o!ZZcGHd#hYVXP)6T+vr@oQWk)T44E^!iVOm{gyo z^zv}tw(}p-%`+~MubU?tH+JSLM}w$%SWEy6cA)CRqIwF?CpyJQZ?SHHA&b!;U=-o4 z+oFKfWtA9M$P1*$%7Tn7!)Y8+=Bh<5!#fP)Wf6^1#F4hLVq91$*p=xAh+VQ%B#Ji* zLwv&{>lXI_mz74DNOk~lGKuLC>&WVqOY=sPSI7H289TVG?kMclw##~>rdu!m(hms~ zmX2M_dw5lw&=nfqKp8*0436;X@)H@Iw5^m5_>tDS>2$U<74%a%+|45zXhRyj&n_>O z?#`BiRez$3wg!O1AUz~V?Td(Vr9~i%TS^EkI%cVi?U_kMp9f1JnAWhCbgSUjATjKK z9T-R@1g;#m>}X|Zdlkc(j=(R6;lpjkxac3r`t?E#L6WHkHsxszI1o0pdfFLAS(5B%e~i}$k>v&IOf|DnAj!qd12Z%PxHDT% zv)b7O-HojM@*rHxoTvv*)YLb_$ z9}?3{U(IzrLZ&9}30b#t8CHOvMTUiU=NzU@PPCQ?hWNJrY#AiXX%J%)WtP0QXuI}q zrPLmYq!EL?bC4PGp+wM1zUnz75>FSEx)LYT=5+)UGK(n>Bot5ZL<$OoE|T5X>%>-$ z#N@1iw%Rb%4O#Y=_Vx~g{h=sX);znU)1ns5Jjk~!;4S0}lsEOd$R3`z3%B#9l)|>2 zn4RyMVX4WUMD83ReMRI9h-a z_zXNcz5Iw0SY-=q5nM+6y66%a=n@kisGdj~O!Z_ru^H?MzC&Ig6dLxZa6x^^bSOhr z%p_hU{z+w9OfrtCeV94NKKsghACHEf@5oDKcJHANkFj@ZqMR5yLWuOv4pm)yS(({C zin~t@?P{T!JZA5)a@Ij!pf4Xdq+Kj%CHzx{XCYg$_}bvUDxQ$R5YQFnXbHxEhuUKz zkNdDdBVAQZ08SG70g952aRl%`X`E_pSy!6JuN(>}eX18j@W&LWDNeiiSp$e^YmJ-s zilN8y(VKm(#daV;*CeV105f#NI*v^-Lg$JDnj{~kBT z<9hg&cX)$lu*qVh5p1V+)u??G@}k4o1snx|=9+od*QkX1FnSstM9HkqpxNYOESK!x z9^dWqsYUstCN9eFZTey>Cd#kmyj8Z-Bf~ntSGQL3Bsf?YrTs)TVrX_GP)3Jf!iuG- zLY*Wi{wQl!;zA#_CQm@C1l07-a1GRFZLn2}c1fO0)yUUfSSH0L#c}tfljx!@yFjFc zN)`Fw4$sDDf?| zLd8}(L36AJC0=QJh!$4>%;;0d+*rS@u1=N>KxBsIEPHmT*X=%8?c_&LBFSjUawVES{Qcc`Yx?q4as8$oUv<$*aw4Lgf z2={l=j)*bl{_M3*{RW$Ly&;$p*TA#WA)2fSZS94g1e9sY_8~-`0x^jqvpq|myv3{o zQs7}?1JM4%KY@GBGPmL2eZfc2P5a@SR>I zid{m2h`1c7YcMJF4Y2!opV6)1;r*o~hw8p&8X=gRjBL*Rp*fUigyZw7T5m4DMzgrx zENkbxC4)R-A!kJolHID(>>9qBZ_-zf%`N0fV`^fB_CbhcQ$1UWMuq0s@ z1S6&3J+>KkRkKW{${HzE{e8QGRtqp}>IMm3C|MKrBH|Vpi%&|UqB#-0W%z)FNoM3a>cH2i$s||1t!tR$66(OaJ7|?@myFw22YMo zI%04V^7oc$$nH41&I~Usu^2YjgtihG_mKMtDA?C3(}?z^BL=>~ed*Nrz%|?ed;N+8 zT>GUVG$E17J8yoOqvnOW2x5YJE-Owo>SV>>2jePzbl>Odw(2W2j_w(%kc>>v;4X1k zpWKDy%$X%qT0j{od+cX*>3JJ9I%ojx#CW2yDjY3JDS-xbg&@gnkrkn_P~=9f0&8Yx4b@E+*&r=-D=;FY{#?BuqTZWrwa%)y zE9wHyNAQmJK{yjXc0YW(m;o^r#fJ`Kfd|QN(UcZArjADh7I~a}Z)V`EV$F&EmYXnb zGQX!%ibs9TGVc-LfUY6~*dijw1>9;}K}tSB4GvYfF2P+5=@06WSF;NZFIlzpsNKv!L}ViM2FTyRp;=r zdo^RL{c!I9qlAJx2H^c(b|sn=Qg#qw`>59?$SOGtS{_Xu5sd<58u0?XN1`>d%IU*Z znruEp%0Tr~^GiXCZ8`&vo~;op#%t6yG}GM8_01>|u@!>-ceWU&5mP?iP|yt-pHA{? z#^;fgq*Z7|l}8F3@MEWVRl7VJ`R5C*jH7SaaJM2$8|>Qt@o~G)M~G7O_e5CEK>%`k z6wB^anH{Qr+|CIk^hZ>pkdm!RV$8iLJULkU>s83aIT)G{Q)cm!ww+@?2fKOGXPSLe zXQCNyUa{B%7BoC70ns2(!M@GVi+&2eMt*cZ0=VaEmdGdqb8qCERRdjoUmB8(TVS^6 z=>Z2asWfWW8fJeN*X3nyhu4YDeSBG_sdY$Q4LVM1z|p!~X)vA%)xv`jqi(Br&suRj zA@s~OOEMxwWDIM9xmmx?mXB?r7&{LVH*0^|Da+^em7*qwwvcv7$H@uM%sxzndwzyU z9}!=SU7>==@(tg4f+G4cbh6&_J4#HMH|vu`rEd>Mq>N0W8zRabe?BQVHjpq*PYBZA zYw0CDKt5rLN@GWP^Zn9@KU#m}e_mkkl8H%e)j-CW>KgO9Hm9GS5<&6H zuVP(|+=%#n9N;yLr4}Zs`RI6s5uMt!L+}u~9k0f|z>CAng)c4w5lx{wD z2jUiaevukJW9sQ;Q>{U$M=ksLjy}QaQaCPPqcLW!0#5giF`BI^c=7x2B^oBUOdrX# ztr%2uq`1c34seD_w(E%Jw^eOX-JnJH;kBJ`6%$|%9Y9uwl@yxTh<>afjl{sXUUHB= zDu*S)*$vY?(dN8%?g-7+g=_H#Zj!s0^&9vAHlX8NrHiF!IncQZ>1x}D&{R@}5l{9| z#M!c>nE|i7ZrW6+8h48~P|Inec=&WOmL~JgRk*2+?~zQSYzHNabDlc$C*afxBDAvD zyiNPrZ7xF}rTJ4elKL#&x(M4E`s}I}*{Vb{P9XMCc8(TTqxg=0FA~OT7$lN5FNfK8 z_=e#ZMr6_&p}Ym@xh2BTPCQWo|}9@8%HY>91r-`-q%=Zkw9U&=+Etx54lEENc$ zpuW?rfzusTVAnMU$nrAQ=u|?P)7HI#VR58-8G4`Xd3JI29HMYS_JUS z!EiI}tS`($+yuY2WD(c&PVbVC0xr^i({c0GR9t{<&?wZ~QaUa7Jm&Q@0(C@u)g7_L zzE0k$aBL&h4hV#d=-Hp=0K`aolzkbnEtzaKBsJcvW1BzmTnik3#Rse4)mZ>>4PwH0 zIGxI!miEDSXTpBsNfG+%)pUakq*cWGrU$iT?tC++QUCSJI@)Jv`!%v}g!(pu>h`2a zmfSW~GRv_XoXbjA;^Ky9GM(^t__O|lk;%X@rU=)&BHhW!%f`r9kZ8O+uI~o{-tpol zg_C|*`q=_CJV$uf7e#`X%m_!$fVnZ}VdaN`$in4XoG1^DGcX8m>QTgPPlaxCyJNgC zxe}|Z0nj%GfyUq5MuBJVh-P040`Ch<*=kp{jaMWeNT%&IU7 za4)?sG(-a9$dR2-1#=#%a1>yZ9LPMO3-(UoIg`!7>!}=oFDkW~dxwFDRI`%V9UeeN zt^$TaX~;U{lP%SIiI*n6@PK6|_`LU*=EFq}%KPo5GyC-vsop+ED0Pt;6!(>o15%s_ zBm+?hhZQZ(njWDi909_tJIfMCGIGpOK3_oEJ<7!_`@RUVq|5oboEke?fq5y~GRr-A z8l!ltwM}pDC{i`2Wu2Qi6(J8rOKr<*OLxDoTx?U(tXG~frE(b_q1K%t>=2n{FoK{b zbce{_0~vV7lOBTtqZ1S0@pR?+f0T_#ZP)vNLijO=35Ly|FrsBb-Emh1&drNU4Pu=n z$qN6N<=^&#FH}PO$Tf`n0d$bX# zCV4A3CDxI;yL))KX)n5{Z;QCq^F)xVov~=JBfq7POfuerz;v|RUqd~avH9J1Z$LiJ zD|ppwZ*d-5CzQPd9sSDQpsjHNuibO6fVfPRyljY?+TjC{6UQP?`(RQ30Ak}ID(d@> z>RHM0sHinmo({?+c8G@gR=FEE?yloe1JSW<%WIp*K_}J37@6{RR=q`5J`qm8)mI}a z7bo83Cu}b^eM?{Ih6@XYf$0mF*AyL@L8H?sW84^-T{E`mc2S)SQ68Vtf*`@Uk4KG` z#EQ1W2||VrRNX05Ux&BpSPoy>?>pV4X!7T&96Zl@?-d@k&R4&t>{QjAReO|?6ag6T zUJoKX9PG`Hx}SGkdbFn(b*3}5U&D3l{Jy3?U>)tB4i7)T-LKrNxf)7nwL6E7Mmmwb zR^cSh48n{Tzv7@kU%BQtAKc^aMrtU>q9W%5gEu&b?XCcQMVhjn^hBs)DIyWzSZMjnmHh=-OsjH<3rgNOvuRruUl~ z5xDeDJPsN>4s1e3JoVG_Wrj}VLmSJDlVWAL*fI>0HoZHZKr#(?S-``_ymuRC+mKo= z&(B?878qql7?@%1tcs8^D@d>{A*;u`SA1(boGYMT-OlIhCJqoE9H-N{kDYf9q8}5UV^CBIj*gx6Auk2sj&f&KF3%Cxx zzM#Udaxn?SfS~*d$>E1`p(}JN3(j%dTQb=cGJhvK=zPb|Zo&kN}0L z-rMpU9R)50KsrUdRbWM8CumZ&Cy+!y%Vv<$h!iaax8r~qS;Anm5ovZc493`ml=@HH zqNPM37=^T|Pa<^#*f9!S@z_jnR%A07+LNCNN$+K_a;Yo&7?*H)5W=L*Zz}X%K*sr5 z6G42@XF*0ZUWX#_t%V;vs+fBfA+$l0hSP5#FoWM?1nNZnqnS?{9@<_(?#q4|SyY5f z?RRq|81zZ&&DS@8EDh+F2~J|4(lv!bfCGb63a*F^muudto~cJ~y$TZ7YR9aT0aQ|$<80x)bxJPM@W!Ezv?!#FcBMcgXE%_RV->5@Pj@%AJ1 z)BjAc%#aNUzpUCUvx5!#31{Hig_Hpem;*(lE-0Z#DyL>I_<%)I6TxTNbty~q215us zteM-Z?oGNe&y1|jFCd|ap3($1r-Ec`RM`f4bu^1!J^}qDk1*PuDyqq;QNX(j@G(wO zkbE*amAV6gAkR=LiiKb+xI$z`vD?JdN)9k&e{zR{;oXBHZF6G&#yVP%yUqxt$9PQ{{9ZrNw?AGsJvq; z`g{>Mcq=B|fNcF$wU}G7zS#n&G=9|R2D$NEf#oj8c+~BMos;prx$$L1k6Z~ z-y-{^uZ9XwjG1s%69+35J5RXPK&+dBg5l7WFiAU48_`$R)Cu4OQfIKH8FGvk!9u#GBIsfN0E)~JZURUR{)7Cb<~ zs4DP%y>UdA5*B6K`fz9SCEWQ1t%{3zzdp8T;MrG}da32np&&cA4&tbBQDjx{u)FO?}+MOJ} zJCZ3QiE5^`_PU@&l1c_TK~n+kD1P|W4~UX=0ob$7NYar+an*{0<&B`yOhC{}*9r~C z2O~O#@KAlxDld!GpgpNmm0r~n8#elDtg_iuOBKv}Pe5o5C&lDSDez~3&S5v?e1t>Z2&(IAck1wy+%PIZkQ+>yWO6d1+xc{qJu8b$9r2H#F;Ww=C^iRcn74?+@DomdB6n05=*wyRRi zPIphp8)7fY(c~`)+fqU#sP9sXf9V!Ou1OxoB}`Jg;k444NBQv&x_TddPA%cFz7YZ4 zmNVXQYqbqG-Yz#B(Z>y)Oq80}JjufiEu`_|@UQZ7dwFhHCz#Pf3;&F50>Cs~f?>J5 zSesnoO7wgYyUTsQabMsS{OW3Z?}_!T#(mRS6jbC?^WFuO5vPKyY+Q&{;Zo8BLN9e5 zq(C%1fN`moOJ)Ye!}ThdRyC^6G;dX~YMKMSo2%<;w*1C6t=b@Vuodu;oKq(MP<7JC zF75xr{7CwE2TZkTV*X@F&cF|Ib1gw$oG-W3o!xwPwyI?byNsS2>>6Z&FB-i zvKvpXgm`H?56Vifu-;Gh82vFyel;P&?X2Wd@lx>zgK^5ix%HniNT~1=Pmajwn=NXx z5f#JDtf0UhsyP*Dfu(q47@3~IpIjSI3t01vRhU|whdz@I7x$L-m<+1O4G}l&rbKcm z!N`3U)2uxFG%P(7h=U|hBN6^oCjG6>O`j3bWqa7TZ7Y@)I-TxUcGk*1)o$1(Jtl8V zm}Z*!_f=}aAc49%CayhX5dM!Xsvu8DJkVdBOoSx z)*&^s;Lj#{7N^VlpO+xF%JL*;7G6dLi6+XN*NMNEZ6$s|sx2Nfl3|d49a1T-Ld05Iem^PZ^vQx z7cF(*o8^<^+|fLl1F%GUIE?fDd6FJhyy8QuoE@!?4!tun>wnpU(rK_OpcN~o>dmSXr?K%_HmrS5GMiQb%8*F zJL8c%#S*VE`nXzB12&>xA}Bo)*4d%h60Sm?rUyJvuT9ZTAmH)3@lK=zhVWRRyc^&{ ziEukXB=Tdk-9(smkW2@(0>OU1EIAJc60C-9M42%|rn#J|9ER2qNGZ{`VqCbMV0jp9 z3ux+_2LjUNNIBUd8gPKxp=n(Fq5w6x>UUH&W<0loeYkg>fpd51Xw@M22Lrh?2F!#f zAqN*2Eh&CgJX>3p6>ke<1|O_kyvhe(!bk1ZlzGh?@Sx*Hq;A+fP`(5=tnL$9u;<8B z$il5WBrOK+BFA?nHz_06=k5)5OV7mswk2?l>=IbDLm>H|9RY=RN_794hjhtq|@=B?%`ncg=h+`L5}r*>YI@c8S+)02QPFqv zPcbTe-#S(zro@86x(zpy3jk-8AK(zj zDfQs8?Xjm_MjmjN>07#`4`!Jjb1(4Jh%NeGi3N9DmYjH?V zGfBKI?INte8!P1zAL)&+n%;l+Wmpxw|BhNpldWujVvUW*VK{&A``b^jHDcdXRg1_s z{>_-Erz>RR`l>j@8mV@lEz1a!Kr=8mWt{gH`rUf~Z~VY)4@0r*K=Ml0^ zo~}M3^?HMVw!Yk<&f)yG6f9w+;U|26mm(D)w?rV9h69VQU}~nXwG_&O@~Gj{C91=K z(Jlh+D?XRlS-L6ePa<|R<)f!hUINY=?SmU%Kw+9XTGU76I@~*&yq>I;E06*}gDdfN2zD5yeBLub#cXANBe%gF% zxeN#IPHS$?Y&osK^n;7qsNwIvib(X^C#%52#!%)3OJrp?_FwQnZN}^` zc@NiquBjYDr;&pb-fb9Za9UMl5;TSE>PPlCU3Gpnt;C&v>QKQjpMC zN}~+473R4yEH|S33cN<5vpezy|EE*THmL^PfJk zA$3LPH4X&7tD5WMoR$6bWG2##WH{wZrD|u(E8S7(CDBx$M2L9(t(4ktb+SN~B|CtX zx))YY>x(Uidy8D?bG#M`6+jCGRCW zkE$c}FaYXD-E!ChVFp!2^R31Gk^bDpXjz6JbBZIjZO1q~oaai&h~I3sQsPVO^kP5=lr$K}?s1Ie>0B9HG_`ZJ=H2_xR9iK!?px zeOc_t%0edyxI_C}og+S`S&QbFskwyZ-ix^s$r82fI=@)G0L~z^IAnDMz3BHq_&@5U zCJ0o*-I0;%3{2k%_@`_hMOc*fy#rDF;}a=gB#bUjut_ z_xUWEpAxKZ2c{@N4Hg%&s-N+!8Ry@;+c#;>pT{A{Qc^y`LctehMFl!(L6G=rU29o3 z4ma!~ki+1-Xds2Wvj(Sp`lnD0fDUDQR`>_!!xTB3o92|FRCE(#6uSA;gzP zuY;H^%Z=Ii=CEgh-oG}fS&-O8uS+)h*B&Q_=*nfx=A zC;7EEZ0i^bmi9VTEEwM&`F>^K8c|$n^XfvrjdZUZvz3xzH8aTXm*zFADRdv$akfOs z4Xp^$u-=2!E|82?u6zJQxUUXEHq_ce=KXPCTldg^K!|J?b>aTq#ZM3VpFsGZZd_+m z7nk3??tf)jQ-$BG3IUiutctEQSP5SWA_BS};g29601b|#QmYSE7xD8oHH3L;r&EuU z9z1&0Jwp1~3=O3kSud3=pkm@NaU*L!mo0HMB?f^j0`iE~&SGq5ivv!T7^2BTp?2SN zVwz4wluT(m;DE2Ak;I0y#sNjveHw`m$V{C^E9Ym|MK$@>0r)ags^7_=hBQbg;R=sA zO)bwsEowva(|B>*gd{1+kFD?OTl*Lwx^k4m5k;Ig9LIp=K*R|H-_<%!+(^YBGOaRS zgRi=>`F{u&&c=WA$n1vE7ICgj&tkq)^tVz1ey-u zm0WIPvv!tUZRvjec3yCZ)_7zs$lrD>_`Ut#&ip^D0W*6$7ZpPzo4)L4F#GdlN+M04szCP|+_D-_gt)c{J zl=H)bWvGi1)l-*3{d9Tswya1IEkI)-p}U0V7RDA^r>ILPsC3E4)`gZC+1ePDmW~C% zHVBHfhWdnM)@#{l!&Q-6MG}fGb1+R;V{Qy2@lE^XOR#-v+dE(V}2%ToKZTH@;TF;RaUjBuOg+1}=(j97G zc;cYX1ir$4>~oZM?xk7i+;FKR&0p?LV_7wduPE;pkq@ms#kf*l7!=i@!h7N~wSLcu z{hd2xW;&o~W`(dcYTeUpmyi3Y6B2EJuM9fl)uaAP{Nwg(fb3RYaU@jc*I%rlqb4p} z&fiAw1^G{g|3gF37XEGY-<{<8DxMCe&bogl3SB9GF}OsZd_?zYrF1k1LK5Bjj3ITC zS)DEIN9{F{81lOdh60yPi}1$@JMrmA70t2YVm}K1&EY z7aV;DPNAtBzV8@XqfIw1>9qAIsv?-))U;1ykTFbkvB>%318+wuD#zu7O*3pnh8@cAd^*-Zn- z=p(%!Jbk%xl-PDq$iO!XU!K|I;{5=;7$He8$2p+EI-6h520zE1mktGry=ycoja&#>NKlpDK)pC8A&>G$~Qs&jCJdMo`I z-^ zjri~KH*VrT75~l(`;(^rC4|5K>i@^t`=|QfSxkSZWB-zg-@K;(QU5O@**~@a&K3IO zV*e7Y-|qN7+W+D`{qq8UCqw*64*wFS-wF9I0>r-&jQ*+r_bKwfk3JFNe<4u(Q~mEH z_|H80U(!kUU+VvwRsU1@@1^5UmHwAxG5weF|53C5d8NN6&wn2U0n2~i#@`ChKh^)9 x0{-2I7OelJ{%`sApZb6I%YR34hwXn&8w%2(zg-vr0Q&c<>$jUkbNu=C{{R-(A5Z`Q diff --git a/templates/sponsors/admin/contracts/renewal-agreement.md b/templates/sponsors/admin/contracts/renewal-agreement.md new file mode 100644 index 000000000..3a401c9d7 --- /dev/null +++ b/templates/sponsors/admin/contracts/renewal-agreement.md @@ -0,0 +1,119 @@ +--- +title: SPONSORSHIP AGREEMENT RENEWAL +geometry: +- margin=1.25in +font-size: 12pt +pagestyle: empty +header-includes: +- \pagenumbering{gobble} +--- + +**THIS SPONSORSHIP AGREEMENT RENEWAL** (the **"Agreement"**) +is entered into and made effective as of the +{{start_date|date:"j"}}{{start_day_english_suffix}} of {{start_date|date:"F Y"}} +(the **"Effective Date"**), +by and between the **Python Software Foundation** (the **"PSF"**), +a Delaware nonprofit corporation, +and **{{sponsor.name|upper}}** (**"Sponsor"**), +a {{sponsor.state}} corporation. +Each of the PSF and Sponsor are hereinafter sometimes individually +referred to as a **"Party"** and collectively as the **"Parties"**. + +## RECITALS + +**WHEREAS**, the PSF is a tax-exempt charitable organization (EIN 04-3594598) +whose mission is to promote, protect, and advance the Python programming language, +and to support and facilitate the growth of a diverse +and international community of Python programmers (the **"Programs"**); + +**WHEREAS**, Sponsor is {{contract.sponsor_info}}; and + +**WHEREAS**, Sponsor and the PSF previously entered into a Sponsorship Agreement +with the effective date of the +{{ previous_effective|date:"j" }}{{ previous_effective_english_suffix }} of {{ previous_effective|date:"F Y" }} +and a term of one year (the “Sponsorship Agreement”). + +**WHEREAS**, Sponsor wishes to renew its support the Programs by making a contribution to the PSF. + +## AGREEMENT + +**NOW, THEREFORE**, in consideration of the foregoing and the mutual covenants contained herein, and for other good and valuable consideration, the receipt and sufficiency of which are hereby acknowledged, the Parties hereto agree to extend and amend the Sponsorship Agreement as follows: + +1. [**Replacement of the Exhibit**]{.underline} Exhibit A to the Sponsorship Agreement is replaced with Exhibit A below. + +1. [**Renewal**]{.underline} Approval and incorporation of this new exhibit with the previous Sponsor Benefits shall be considered written notice by Sponsor to the PSF that you wish to continue the terms of the Sponsorship Agreement for an additional year and to contribute the new Sponsorship Payment specified in Exhibit A, beginning on the Effective Date, as contemplated by Section 6 of the Sponsorship Agreement. + +  + + +### \[Signature Page Follows\] + +::: {.page-break} +\newpage +::: + +## SPONSORSHIP AGREEMENT RENEWAL + +**IN WITNESS WHEREOF**, the Parties hereto have duly executed this **Sponsorship Agreement Renewal** as of the **Effective Date**. + +  + +**PSF**: +**PYTHON SOFTWARE FOUNDATION**, +a Delaware non profit corporation + +  + +By:        ________________________________ +Name:   Loren Crary +Title:     Director of Resource Development + +  + +  + +**SPONSOR**: +**{{sponsor.name|upper}}**, +a {{sponsor.state}} entity + +  + +By:        ________________________________ +Name:   ________________________________ +Title:     ________________________________ + +::: {.page-break} +\newpage +::: + +## SPONSORSHIP AGREEMENT RENEWAL + +### EXHIBIT A + +1. [**Sponsorship**]{.underline} During the Term of this Agreement, in return for the Sponsorship Payment, the PSF agrees to identify and acknowledge Sponsor as a {{sponsorship.year}} {{sponsorship.level_name}} Sponsor of the Programs and of the PSF, in accordance with the United States Internal Revenue Service guidance applicable to qualified sponsorship payments. + + Acknowledgments of appreciation for the Sponsorship Payment may identify and briefly describe Sponsor and its products or product lines in neutral terms and may include Sponsor’s name, logo, well-established slogan, locations, telephone numbers, or website addresses, but such acknowledgments shall not include (a) comparative or qualitative descriptions of Sponsor’s products, services, or facilities; (b) price information or other indications of savings or value associated with Sponsor’s products or services; (c) a call to action; (d) an endorsement; or (e) an inducement to buy, sell, or use Sponsor’s products or services. Any such acknowledgments will be created, or subject to prior review and approval, by the PSF. + + The PSF’s acknowledgment may include the following: + + - [**Display of Logo**]{.underline} The PSF will display Sponsor’s logo and other agreed-upon identifying information on www.python.org, and on any marketing and promotional media made by the PSF in connection with the Programs, solely for the purpose of acknowledging Sponsor as a sponsor of the Programs in a manner (placement, form, content, etc.) reasonably determined by the PSF in its sole discretion. Sponsor agrees to provide all the necessary content and materials for use in connection with such display. + + - Additional acknowledgment as provided in Sponsor Benefits. + +1. [**Sponsorship Payment**]{.underline} The amount of Sponsorship Payment shall be {{sponsorship.verbose_sponsorship_fee|title}} USD ($ {{sponsorship.sponsorship_fee}}). The Sponsorship Payment is due within thirty (30) days of the Effective Date. To the extent that any portion of a payment under this section would not (if made as a Separate payment) be deemed a qualified sponsorship payment under IRC § 513(i), such portion shall be deemed and treated as separate from the qualified sponsorship payment. + +1. [**Receipt of Payment**]{.underline} Sponsor must submit full payment in order to secure Sponsor Benefits. + +1. [**Refunds**]{.underline} The PSF does not offer refunds for sponsorships. The PSF may cancel the event(s) or any part thereof. In that event, the PSF shall determine and refund to Sponsor the proportionate share of the balance of the aggregate Sponsorship fees applicable to event(s) received which remain after deducting all expenses incurred by the PSF. + +1. [**Sponsor Benefits**]{.underline} Sponsor Benefits per the Agreement are: + + 1. Acknowledgement as described under "Sponsorship" above. + +{%for benefit in benefits%} 1. {{benefit}} +{%endfor%} + +{%if legal_clauses%}1. Legal Clauses. Related legal clauses are: + +{%for clause in legal_clauses%} 1. {{clause}} +{%endfor%}{%endif%} diff --git a/templates/sponsors/admin/contracts/sponsorship-agreement.md b/templates/sponsors/admin/contracts/sponsorship-agreement.md new file mode 100644 index 000000000..ee0d91ce3 --- /dev/null +++ b/templates/sponsors/admin/contracts/sponsorship-agreement.md @@ -0,0 +1,209 @@ +--- +title: SPONSORSHIP AGREEMENT +geometry: +- margin=1.25in +font-size: 12pt +pagestyle: empty +header-includes: +- \pagenumbering{gobble} +--- + +**THIS SPONSORSHIP AGREEMENT** (the **"Agreement"**) +is entered into and made effective as of the +{{start_date|date:"j"}}{{start_day_english_suffix}} of {{start_date|date:"F Y"}} +(the **"Effective Date"**), +by and between the **Python Software Foundation** (the **"PSF"**), +a Delaware nonprofit corporation, +and **{{sponsor.name|upper}}** (**"Sponsor"**), +a {{sponsor.state}} corporation. +Each of the PSF and Sponsor are hereinafter sometimes individually +referred to as a **"Party"** and collectively as the **"Parties"**. + +## RECITALS + +**WHEREAS**, the PSF is a tax-exempt charitable organization (EIN 04-3594598) +whose mission is to promote, protect, and advance the Python programming language, +and to support and facilitate the growth of a diverse +and international community of Python programmers (the **"Programs"**); + +**WHEREAS**, Sponsor is {{contract.sponsor_info}}; and + +**WHEREAS**, Sponsor wishes to support the Programs by making a contribution to the PSF. + +## AGREEMENT + +**NOW, THEREFORE**, in consideration of the foregoing and the mutual covenants contained herein, and for other good and valuable consideration, the receipt and sufficiency of which are hereby acknowledged, the Parties hereto agree as follows: + +1. [**Recitals Incorporated**]{.underline}. Each of the above Recitals is incorporated into and is made a part of this Agreement. + +1. [**Exhibits Incorporated by Reference**]{.underline}. All exhibits referenced in this Agreement are incorporated herein as integral parts of this Agreement and shall be considered reiterated herein as fully as if such provisions had been set forth verbatim in this Agreement. + +1. [**Sponsorship Payment**]{.underline} In consideration for the right to sponsor the PSF and its Programs, and to be acknowledged by the PSF as a sponsor in the manner described herein, Sponsor shall make a contribution to the PSF (the "Sponsorship Payment") in the amount shown in Exhibit A. + +1. [**Acknowledgement of Sponsor**]{.underline} In return for the Sponsorship Payment, Sponsor will be entitled to receive the sponsorship package described in Exhibit A attached hereto (the "Sponsor Benefits"). + +1. [**Intellectual Property**]{.underline} The PSF is the sole owner of all right, title, and interest to all the PSF information, including the PSF’s logo, trademarks, trade names, and copyrighted information, unless otherwise provided. + + (a) [Grant of License by the PSF]{.underline} The PSF hereby grants to Sponsor a limited, non- exclusive license to use certain of the PSF’s intellectual property, including the PSF’s name, acronym, and logo (collectively, the "PSF Intellectual Property"), solely in connection with promotion of Sponsor’s sponsorship of the Programs. Sponsor agrees that it shall not use the PSF’s Property in a manner that states or implies that the PSF endorses Sponsor (or Sponsor’s products or services). The PSF retains the right, in its sole and absolute discretion, to review and approve in advance all uses of the PSF Intellectual Property, which approval shall not be unreasonably withheld. + + (a) [Grant of License by Sponsor]{.underline} Sponsor hereby grants to the PSF a limited, non-exclusive license to use certain of Sponsor’s intellectual property, including names, trademarks, and copyrights (collectively, "Sponsor Intellectual Property"), solely to identify Sponsor as a sponsor of the Programs and the PSF. Sponsor retains the right to review and approve in advance all uses of the Sponsor Intellectual Property, which approval shall not be unreasonably withheld. + +1. [**Term**]{.underline} The Term of this Agreement will begin on the Effective Date and continue for a period of one (1) year. The Agreement may be renewed for one (1) year by written notice from Sponsor to the PSF. + +1. [**Termination**]{.underline} The Agreement may be terminated (i) by either Party for any reason upon sixty (60) days prior written notice to the other Party; (ii) if one Party notifies the other Party that the other Party is in material breach of its obligations under this Agreement and such breach (if curable) is not cured with fifteen (15) days of such notice; (iii) if both Parties agree to terminate by mutual written consent; or (iv) if any of Sponsor information is found or is reasonably alleged to violate the rights of a third party. The PSF shall also have the unilateral right to terminate this Agreement at any time if it reasonably determines that it would be detrimental to the reputation and goodwill of the PSF or the Programs to continue to accept or use funds from Sponsor. Upon expiration or termination, no further use may be made by either Party of the other’s name, marks, logo or other intellectual property without the express prior written authorization of the other Party. + +1. [**Code of Conduct**]{.underline} Sponsor and all of its representatives shall conduct themselves at all times in accordance with the Python Software Foundation Code of Conduct (https://www.python.org/psf/conduct) and/or the PyCon Code of Conduct (https://pycon.us/code-of-conduct), as applicable. The PSF reserves the right to eject from any event any Sponsor or representative violating those standards. + +1. [**Deadlines**]{.underline} Company logos, descriptions, banners, advertising pages, tote bag inserts and similar items and information must be provided by the applicable deadlines for inclusion in the promotional materials for the PSF. + +1. [**Assignment of Space**]{.underline} If the Sponsor Benefits in Exhibit A include a booth or other display space, the PSF shall assign display space to Sponsor for the period of the display. Location assignments will be on a first-come, first-served basis and will be made solely at the discretion of the PSF. Failure to use a reserved space will result in penalties (up to 50% of your Sponsorship Payment). + +1. [**Job Postings**]{.underline} Sponsor will ensure that any job postings to be published by the PSF on Sponsor’s behalf comply with all applicable municipal, state, provincial, and federal laws. + +1. [**Representations and Warranties**]{.underline} Each Party represents and warrants for the benefit of the other Party that it has the legal authority to enter into this Agreement and is able to comply with the terms herein. Sponsor represents and warrants for the benefit of the PSF that it has full right and title to the Sponsor Intellectual Property to be provided under this Agreement and is not under any obligation to any party that restricts the Sponsor Intellectual Property or would prevent Sponsor’s performance under this Agreement. + +1. [**Successors and Assigns**]{.underline} This Agreement and all the terms and provisions hereof shall be binding upon and inure to the benefit of the Parties and their respective legal representatives, heirs, successors, and/or assigns. The transfer, or any attempted assignment or transfer, of all or any portion of this Agreement by a Party without the prior written consent of the other Party shall be null and void and of no effect. + +1. [**No Third-Party Beneficiaries**]{.underline} This Agreement is not intended to benefit and shall not be construed to confer upon any person, other than the Parties, any rights, remedies, or other benefits, including but not limited to third-party beneficiary rights. + +1. [**Severability**]{.underline} If any one or more of the provisions of this Agreement shall be held to be invalid, illegal, or unenforceable, the validity, legality, or enforceability of the remaining provisions of this Agreement shall not be affected thereby. To the extent permitted by applicable law, each Party waives any provision of law which renders any provision of this Agreement invalid, illegal, or unenforceable in any respect. + +1. [**Confidential Information**]{.underline} As used herein, "Confidential Information" means all confidential information disclosed by a Party ("Disclosing Party") to the other Party ("Receiving Party"), whether orally or in writing, that is designated as confidential or that reasonably should be understood to be confidential given the nature of the information. Each Party agrees: (a) to observe complete confidentiality with respect to the Confidential Information of the Disclosing Party; (b) not to disclose, or permit any third party or entity access to disclose, the Confidential Information (or any portion thereof) of the Disclosing Party without prior written permission of Disclosing Party; and (c) to ensure that any employees, or any third parties who receive access to the Confidential Information, are advised of the confidential and proprietary nature thereof and are prohibited from disclosing the Confidential Information and using the Confidential Information other than for the benefit of the Receiving Party in accordance with this Agreement. Without limiting the foregoing, each Party shall use the same degree of care that it uses to protect the confidentiality of its own confidential information of like kind, but in no event less than reasonable care. Neither Party shall have any liability with respect to Confidential Information to the extent such information: (w) is or becomes publicly available (other than through a breach of this Agreement); (x) is or becomes available to the Receiving Party on a non-confidential basis, provided that the source of such information was not known by the Receiving Party (after such inquiry as would be reasonable in the circumstances) to be the subject of a confidentiality agreement or other legal or contractual obligation of confidentiality with respect to such information; (y) is developed by the Receiving Party independently and without reference to information provided by the Disclosing Party; or (z) is required to be disclosed by law or court order, provided the Receiving Party gives the Disclosing Party prior notice of such compelled disclosure (to the extent legally permitted) and reasonable assistance, at the Disclosing Party’s cost. + +1. [**Independent Contractors**]{.underline} Nothing contained herein shall constitute or be construed as the creation of any partnership, agency, or joint venture relationship between the Parties. Neither of the Parties shall have the right to obligate or bind the other Party in any manner whatsoever, and nothing herein contained shall give or is intended to give any rights of any kind to any third party. The relationship of the Parties shall be as independent contractors. + +1. [**Indemnification**]{.underline} Sponsor agrees to indemnify and hold harmless the PSF, its officers, directors, employees, and agents, for any and all claims, losses, damages, liabilities, judgments, or settlements, including reasonable attorneys’ fees, costs (including costs associated with any official investigations or inquiries) and other expenses, incurred on account of Sponsor’s acts or omissions in connection with the performance of this Agreement or breach of this Agreement or with respect to the manufacture, marketing, sale, or dissemination of any of Sponsor’s products or services. The PSF shall have no liability to Sponsor with respect to its participation in this Agreement or receipt of the Sponsorship Payment, except for intentional or willful acts of the PSF or its employees or agents. The rights and responsibilities established in this section shall survive indefinitely beyond the term of this Agreement. + +1. [**Notices**]{.underline} All notices or other communications to be given or delivered under the provisions of this Agreement shall be in writing and shall be mailed by certified or registered mail, return receipt requested, or given or delivered by reputable courier, facsimile, or electronic mail to the Party to receive notice at the following addresses or at such other address as any Party may by notice direct in accordance with this Section: + + + If to Sponsor: + + > {{sponsor.primary_contact.name}} + > {{sponsor.name}} + > {{sponsor.mailing_address_line_1}}{%if sponsor.mailing_address_line_2%} + > {{sponsor.mailing_address_line_2 }}{% endif %} + > {{sponsor.city}}, {{sponsor.state}} {{sponsor.postal_code}} {{sponsor.country}} + > Facsimile: {{sponsor.primary_contact.phone}} + > Email: {{sponsor.primary_contact.email}} + +   + + If to the PSF: + + > Deb Nicholson + > Executive Director + > Python Software Foundation + > 9450 SW Gemini Dr. ECM # 90772 + > Beaverton, OR 97008 USA + > Facsimile: +1 (858) 712-8966 + > Email: deb@python.org + +   + + With a copy to: + + > Archer & Greiner, P.C. + > Attention: Noel Fleming + > Three Logan Square + > 1717 Arch Street, Suite 3500 + > Philadelphia, PA 19103 USA + > Facsimile: (215) 963-9999 + > Email: nfleming@archerlaw.com + +   + + Notices given by registered or certified mail shall be deemed as given on the delivery date shown on the return receipt, and notices given in any other manner shall be deemed as given when received. + +1. [**Governing Law; Jurisdiction**]{.underline} This Agreement shall be construed in accordance with the laws of the State of Delaware, without regard to its conflicts of law principles. Jurisdiction and venue for litigation of any dispute, controversy, or claim arising out of or in connection with this Agreement shall be only in a United States federal court in Delaware or a Delaware state court having subject matter jurisdiction. Each of the Parties hereto hereby expressly submits to the personal jurisdiction of the foregoing courts located in Delaware and hereby waives any objection or defense based on personal jurisdiction or venue that might otherwise be asserted to proceedings in such courts. + +1. [**Force Majeure**]{.underline} The PSF shall not be liable for any failure or delay in performing its obligations hereunder if such failure or delay is due in whole or in part to any cause beyond its reasonable control or the reasonable control of its contractors, agents, or suppliers, including, but not limited to, strikes, or other labor disturbances, acts of God, acts of war or terror, floods, sabotage, fire, natural, or other disasters, including pandemics. To the extent the PSF is unable to substantially perform hereunder due to any cause beyond its control as contemplated herein, it may terminate this Agreement as it may decide in its sole discretion. To the extent the PSF so terminates the Agreement, Sponsor releases the PSF and waives any claims for damages or compensation on account of such termination. + +1. [**No Waiver**]{.underline} A waiver of any breach of any provision of this Agreement shall not be deemed a waiver of any repetition of such breach or in any manner affect any other terms of this Agreement. + +1. [**Limitation of Damages**]{.underline} Except as otherwise provided herein, neither Party shall be liable to the other for any consequential, incidental, or punitive damages for any claims arising directly or indirectly out of this Agreement. + +1. [**Cumulative Remedies**]{.underline} All rights and remedies provided in this Agreement are cumulative and not exclusive, and the exercise by either Party of any right or remedy does not preclude the exercise of any other rights or remedies that may now or subsequently be available at law, in equity, by statute, in any other agreement between the Parties, or otherwise. + +1. [**Captions**]{.underline} The captions and headings are included herein for convenience and do not constitute a part of this Agreement. + +1. [**Amendments**]{.underline} No addition to or change in the terms of this Agreement will be binding on any Party unless set forth in writing and executed by both Parties. + +1. [**Counterparts**]{.underline} This Agreement may be executed in one or more counterparts, each of which shall be deemed an original and all of which shall be taken together and deemed to be one instrument. A signed copy of this Agreement delivered by facsimile, electronic mail, or other means of electronic transmission shall be deemed to have the same legal effect as delivery of an original signed copy of this Agreement. + +1. [**Entire Agreement**]{.underline} This Agreement (including the Exhibits) sets forth the entire agreement of the Parties and supersedes all prior oral or written agreements or understandings between the Parties as to the subject matter of this Agreement. Except as otherwise expressly provided herein, neither Party is relying upon any warranties, representations, assurances, or inducements of the other Party. + +  + + +### \[Signature Page Follows\] + +::: {.page-break} +\newpage +::: + +## SPONSORSHIP AGREEMENT + +**IN WITNESS WHEREOF**, the Parties hereto have duly executed this **Sponsorship Agreement** as of the **Effective Date**. + +  + +> **PSF**: +> **PYTHON SOFTWARE FOUNDATION**, +> a Delaware non profit corporation + +  + +> By:        ________________________________ +> Name:   Loren Crary +> Title:     Director of Resource Development + +  + +  + +> **SPONSOR**: +> **{{sponsor.name|upper}}**, +> a {{sponsor.state}} entity + +  + +> By:        ________________________________ +> Name:   ________________________________ +> Title:     ________________________________ + +::: {.page-break} +\newpage +::: + +## SPONSORSHIP AGREEMENT + +### EXHIBIT A + +1. [**Sponsorship**]{.underline} During the Term of this Agreement, in return for the Sponsorship Payment, the PSF agrees to identify and acknowledge Sponsor as a {{sponsorship.year}} {{sponsorship.level_name}} Sponsor of the Programs and of the PSF, in accordance with the United States Internal Revenue Service guidance applicable to qualified sponsorship payments. + + Acknowledgments of appreciation for the Sponsorship Payment may identify and briefly describe Sponsor and its products or product lines in neutral terms and may include Sponsor’s name, logo, well-established slogan, locations, telephone numbers, or website addresses, but such acknowledgments shall not include (a) comparative or qualitative descriptions of Sponsor’s products, services, or facilities; (b) price information or other indications of savings or value associated with Sponsor’s products or services; (c) a call to action; (d) an endorsement; or (e) an inducement to buy, sell, or use Sponsor’s products or services. Any such acknowledgments will be created, or subject to prior review and approval, by the PSF. + + The PSF’s acknowledgment may include the following: + + (a) [**Display of Logo**]{.underline} The PSF will display Sponsor’s logo and other agreed-upon identifying information on www.python.org, and on any marketing and promotional media made by the PSF in connection with the Programs, solely for the purpose of acknowledging Sponsor as a sponsor of the Programs in a manner (placement, form, content, etc.) reasonably determined by the PSF in its sole discretion. Sponsor agrees to provide all the necessary content and materials for use in connection with such display. + + (a) Additional acknowledgment as provided in Sponsor Benefits. + +1. [**Sponsorship Payment**]{.underline} The amount of Sponsorship Payment shall be {{sponsorship.verbose_sponsorship_fee|title}} USD ($ {{sponsorship.sponsorship_fee}}). The Sponsorship Payment is due within thirty (30) days of the Effective Date. To the extent that any portion of a payment under this section would not (if made as a Separate payment) be deemed a qualified sponsorship payment under IRC § 513(i), such portion shall be deemed and treated as separate from the qualified sponsorship payment. + +1. [**Receipt of Payment**]{.underline} Sponsor must submit full payment in order to secure Sponsor Benefits. + +1. [**Refunds**]{.underline} The PSF does not offer refunds for sponsorships. The PSF may cancel the event(s) or any part thereof. In that event, the PSF shall determine and refund to Sponsor the proportionate share of the balance of the aggregate Sponsorship fees applicable to event(s) received which remain after deducting all expenses incurred by the PSF. + +1. [**Sponsor Benefits**]{.underline} Sponsor Benefits per the Agreement are: + + 1. Acknowledgement as described under "Sponsorship" above. + +{%for benefit in benefits%} 1. {{benefit}} +{%endfor%} + +{%if legal_clauses%}1. Legal Clauses. Related legal clauses are: + +{%for clause in legal_clauses%} 1. {{clause}} +{%endfor%}{%endif%} diff --git a/templates/sponsors/admin/preview-contract.html b/templates/sponsors/admin/preview-contract.html deleted file mode 100644 index f89fd02b0..000000000 --- a/templates/sponsors/admin/preview-contract.html +++ /dev/null @@ -1,283 +0,0 @@ -{% extends "easy_pdf/base.html" %} -{% load humanize %} - -{% block extra_style %} - -{% endblock %} - -{% block content %} -

    SPONSORSHIP AGREEMENT

    - -

    THIS SPONSORSHIP AGREEMENT (the “Agreement”) is entered into and made -effective as of the {{ start_date|date:"dS" }} day of {{ start_date|date:"F, Y"}} (the “Effective Date”), by and between -Python Software Foundation (the “PSF”), a Delaware nonprofit corporation, and {{ sponsor.name|upper }} (“Sponsor”), a {{ sponsor.state }} corporation. Each of the PSF and Sponsor are -hereinafter sometimes individually referred to as a “Party” and collectively as the “Parties”.

    - -

    RECITALS

    - -

    WHEREAS, the PSF is a tax-exempt charitable organization (EIN 04-3594598) whose -mission is to promote, protect, and advance the Python programming language, and to support -and facilitate the growth of a diverse and international community of Python programmers (the -“Programs”);

    - -

    WHEREAS, Sponsor is {{ contract.sponsor_info}}; and

    - -

    WHEREAS, Sponsor wishes to support the Programs by making a contribution to the -PSF.

    - -

    AGREEMENT

    - -

    NOW, THEREFORE, in consideration of the foregoing and the mutual covenants -contained herein, and for other good and valuable consideration, the receipt and sufficiency of -which are hereby acknowledged, the Parties hereto agree as follows:

    - -
      -
    1. Recitals Incorporated. Each of the above Recitals is incorporated into and is made a part of this Agreement.
    2. - -
    3. Exhibits Incorporated by Reference. All exhibits referenced in this Agreement are incorporated herein as integral parts of this Agreement and shall be considered reiterated herein as fully as if such provisions had been set forth verbatim in this Agreement.
    4. - -
    5. Sponsorship Payment. In consideration for the right to sponsor the PSF and its Programs, and to be acknowledged by the PSF as a sponsor in the manner described herein, Sponsor shall make a contribution to the PSF (the “Sponsorship Payment”) in the amount shown in Exhibit A.
    6. - -
    7. Acknowledgement of Sponsor. In return for the Sponsorship Payment, Sponsor will be entitled to receive the sponsorship package described in Exhibit A attached hereto (the “Sponsor Benefits”).
    8. - -
    9. Intellectual Property. The PSF is the sole owner of all right, title, and interest to all the PSF information, including the PSF’s logo, trademarks, trade names, and copyrighted information, unless otherwise provided.
    10. - -
        -
      1. Grant of License by the PSF. The PSF hereby grants to Sponsor a limited, non-exclusive license to use certain of the PSF’s intellectual property, including the PSF’s name, acronym, and logo (collectively, the “PSF Intellectual Property”), solely in connection with promotion of Sponsor’s sponsorship of the Programs. Sponsor agrees that it shall not use the PSF’s Property in a manner that states or implies that the PSF endorses Sponsor (or Sponsor’s products or services). The PSF retains the right, in its sole and absolute discretion, to review and approve in advance all uses of the PSF Intellectual Property, which approval shall not be unreasonably withheld.
      2. - -
      3. Grant of License by Sponsor. Sponsor hereby grants to the PSF a limited, non-exclusive license to use certain of Sponsor’s intellectual property, including names, trademarks, and copyrights (collectively, “Sponsor Intellectual Property”), solely to identify Sponsor as a sponsor of the Programs and the PSF. Sponsor retains the right to review and approve in advance all uses of the Sponsor Intellectual Property, which approval shall not be unreasonably withheld.
      4. -
      - - -
    11. Term. The Term of this Agreement will begin on {{ start_date|date:"dS, F Y"}} and continue for a period of one (1) year. The Agreement may be renewed for one (1) year by written notice from Sponsor to the PSF.
    12. - -
    13. Termination. The Agreement may be terminated (i) by either Party for any reason upon sixty (60) days prior written notice to the other Party; (ii) if one Party notifies the other Party that the other Party is in material breach of its obligations under this Agreement and such breach (if curable) is not cured with fifteen (15) days of such notice; (iii) if both Parties agree to terminate by mutual written consent; or (iv) if any of Sponsor information is found or is reasonably alleged to violate the rights of a third party. The PSF shall also have the unilateral right to terminate this Agreement at any time if it reasonably determines that it would be detrimental to the reputation and goodwill of the PSF or the Programs to continue to accept or use funds from Sponsor. Upon expiration or termination, no further use may be made by either Party of the other’s name, marks, logo or other intellectual property without the express prior written authorization of the other Party.
    14. - -
    15. Code of Conduct. Sponsor and all of its representatives shall conduct themselves at all times in accordance with the Python Software Foundation Code of Conduct (https://www.python.org/psf/codeofconduct) and/or the PyCon Code of Conduct (https://us.pycon.org/2021/about/code-of-conduct/), as applicable. The PSF reserves the right to eject from any event any Sponsor or representative violating those standards.
    16. - -
    17. Deadlines. Company logos, descriptions, banners, advertising pages, tote bag inserts and similar items and information must be provided by the applicable deadlines for inclusion in the promotional materials for the PSF.
    18. - -
    19. Assignment of Space. If the Sponsor Benefits in Exhibit A include a booth or other display space, the PSF shall assign display space to Sponsor for the period of the display. Location assignments will be on a first-come, first-served basis and will be made solely at the discretion of the PSF. Failure to use a reserved space will result in penalties (up to 50% of your Sponsorship Payment).
    20. - -
    21. Job Postings. Sponsor will ensure that any job postings to be published by the PSF on Sponsor’s behalf comply with all applicable municipal, state, provincial, and federal laws.
    22. - -
    23. Representations and Warranties. Each Party represents and warrants for the benefit of the other Party that it has the legal authority to enter into this Agreement and is able to comply with the terms herein. Sponsor represents and warrants for the benefit of the PSF that it has full right and title to the Sponsor Intellectual Property to be provided under this Agreement and is not under any obligation to any party that restricts the Sponsor Intellectual Property or would prevent Sponsor’s performance under this Agreement.
    24. - -
    25. Successors and Assigns. This Agreement and all the terms and provisions hereof shall be binding upon and inure to the benefit of the Parties and their respective legal representatives, heirs, successors, and/or assigns. The transfer, or any attempted assignment or transfer, of all or any portion of this Agreement by a Party without the prior written consent of the other Party shall be null and void and of no effect.
    26. - -
    27. No Third-Party Beneficiaries. This Agreement is not intended to benefit and shall not be construed to confer upon any person, other than the Parties, any rights, remedies, or other benefits, including but not limited to third-party beneficiary rights.
    28. - -
    29. Severability. If any one or more of the provisions of this Agreement shall be held to be invalid, illegal, or unenforceable, the validity, legality, or enforceability of the remaining provisions of this Agreement shall not be affected thereby. To the extent permitted by applicable law, each Party waives any provision of law which renders any provision of this Agreement invalid, illegal, or unenforceable in any respect.
    30. - -
    31. Confidential Information. As used herein, “Confidential Information” means all confidential information disclosed by a Party (“Disclosing Party”) to the other Party (“Receiving Party”), whether orally or in writing, that is designated as confidential or that reasonably should be understood to be confidential given the nature of the information. Each Party agrees: (a) to observe complete confidentiality with respect to the Confidential Information of the Disclosing Party; (b) not to disclose, or permit any third party or entity access to disclose, the Confidential Information (or any portion thereof) of the Disclosing Party without prior written permission of Disclosing Party; and (c) to ensure that any employees, or any third parties who receive access to the Confidential Information, are advised of the confidential and proprietary nature thereof and are prohibited from disclosing the Confidential Information and using the Confidential Information other than for the benefit of the Receiving Party in accordance with this Agreement. Without limiting the foregoing, each Party shall use the same degree of care that it uses to protect the confidentiality of its own confidential information of like kind, but in no event less than reasonable care. Neither Party shall have any liability with respect to Confidential Information to the extent such information: (w) is or becomes publicly available (other than through a breach of this Agreement); (x) is or becomes available to the Receiving Party on a non-confidential basis, provided that the source of such information was not known by the Receiving Party (after such inquiry as would be reasonable in the circumstances) to be the subject of a confidentiality agreement or other legal or contractual obligation of confidentiality with respect to such information; (y) is developed by the Receiving Party independently and without reference to information provided by the Disclosing Party; or (z) is required to be disclosed by law or court order, provided the Receiving Party gives the Disclosing Party prior notice of such compelled disclosure (to the extent legally permitted) and reasonable assistance, at the Disclosing Party’s cost.
    32. - -
    33. Independent Contractors. Nothing contained herein shall constitute or be construed as the creation of any partnership, agency, or joint venture relationship between the Parties. Neither of the Parties shall have the right to obligate or bind the other Party in any manner whatsoever, and nothing herein contained shall give or is intended to give any rights of any kind to any third party. The relationship of the Parties shall be as independent contractors.
    34. - -
    35. Indemnification. Sponsor agrees to indemnify and hold harmless the PSF, its officers, directors, employees, and agents, for any and all claims, losses, damages, liabilities, judgments, or settlements, including reasonable attorneys’ fees, costs (including costs associated with any official investigations or inquiries) and other expenses, incurred on account of Sponsor’s acts or omissions in connection with the performance of this Agreement or breach of this Agreement or with respect to the manufacture, marketing, sale, or dissemination of any of Sponsor’s products or services. The PSF shall have no liability to Sponsor with respect to its participation in this Agreement or receipt of the Sponsorship Payment, except for intentional or willful acts of the PSF or its employees or agents. The rights and responsibilities established in this section shall survive indefinitely beyond the term of this Agreement.
    36. - -
    37. - Notices. All notices or other communications to be given or delivered under the provisions of this Agreement shall be in writing and shall be mailed by certified or registered mail, return receipt requested, or given or delivered by reputable courier, facsimile, or electronic mail to the Party to receive notice at the following addresses or at such other address as any Party may by notice direct in accordance with this Section: - -
      -
      -

      If to Sponsor:

      -
      -

      {{ sponsor.primary_contact.name }}

      -

      {{ sponsor.name }}

      -

      {{ sponsor.mailing_address_line_1 }}

      - {% if sponsor.mailing_address_line_2 %} -

      {{ sponsor.mailing_address_line_2 }}

      - {% endif %} -

      Facsimile: {{ sponsor.primary_contact.phone }}

      -

      Email: {{ sponsor.primary_contact.email }}

      -
      -

      If to the PSF:

      -
      -

      Ewa Jodlowska

      -

      Executive Director

      -

      Python Software Foundation

      -

      9450 SW Gemini Dr. ECM # 90772

      -

      Beaverton, OR 97008 USA

      -

      Facsimile: +1 (858) 712-8966

      -

      Email: ewa@python.org

      -
      -

      With a copy to:

      -

      Fleming Petenko Law

      -

      1800 John F. Kennedy Blvd

      -

      Suite 904

      -

      Philadelphia, PA 19103 USA

      -

      Facsimile: (267) 422-9864

      -

      Email: info@nonprofitlawllc.com

      -
      -
      -

      Notices given by registered or certified mail shall be deemed as given on the delivery date shown on the return receipt, and notices given in any other manner shall be deemed as given when received.

      -
    38. - -
    39. Governing Law; Jurisdiction. This Agreement shall be construed in accordance with the laws of the State of Delaware, without regard to its conflicts of law principles. Jurisdiction and venue for litigation of any dispute, controversy, or claim arising out of or in connection with this Agreement shall be only in a United States federal court in Delaware or a Delaware state court having subject matter jurisdiction. Each of the Parties hereto hereby expressly submits to the personal jurisdiction of the foregoing courts located in Delaware and hereby waives any objection or defense based on personal jurisdiction or venue that might otherwise be asserted to proceedings in such courts.
    40. - -
    41. Force Majeure. The PSF shall not be liable for any failure or delay in performing its obligations hereunder if such failure or delay is due in whole or in part to any cause beyond its reasonable control or the reasonable control of its contractors, agents, or suppliers, including, but not limited to, strikes, or other labor disturbances, acts of God, acts of war or terror, floods, sabotage, fire, natural, or other disasters, including pandemics. To the extent the PSF is unable to substantially perform hereunder due to any cause beyond its control as contemplated herein, it may terminate this Agreement as it may decide in its sole discretion. To the extent the PSF so terminates the Agreement, Sponsor releases the PSF and waives any claims for damages or compensation on account of such termination.
    42. - -
    43. No Waiver. A waiver of any breach of any provision of this Agreement shall not be deemed a waiver of any repetition of such breach or in any manner affect any other terms of this Agreement.
    44. - -
    45. Limitation of Damages. Except as otherwise provided herein, neither Party shall be liable to the other for any consequential, incidental, or punitive damages for any claims arising directly or indirectly out of this Agreement.
    46. - -
    47. Cumulative Remedies. All rights and remedies provided in this Agreement are cumulative and not exclusive, and the exercise by either Party of any right or remedy does not preclude the exercise of any other rights or remedies that may now or subsequently be available at law, in equity, by statute, in any other agreement between the Parties, or otherwise.
    48. - -
    49. Captions. The captions and headings are included herein for convenience and do not constitute a part of this Agreement.
    50. - -
    51. Amendments. No addition to or change in the terms of this Agreement will be binding on any Party unless set forth in writing and executed by both Parties.
    52. - -
    53. Counterparts. This Agreement may be executed in one or more counterparts, each of which shall be deemed an original and all of which shall be taken together and deemed to be one instrument. A signed copy of this Agreement delivered by facsimile, electronic mail, or other means of electronic transmission shall be deemed to have the same legal effect as delivery of an original signed copy of this Agreement.
    54. - -
    55. Entire Agreement. This Agreement (including the Exhibits) sets forth the entire agreement of the Parties and supersedes all prior oral or written agreements or understandings between the Parties as to the subject matter of this Agreement. Except as otherwise expressly provided herein, neither Party is relying upon any warranties, representations, assurances, or inducements of the other Party.
    56. -
    - -

    [Signature Page Follows]

    -
    - -

    SPONSORSHIP AGREEMENT

    - - -

    IN WITNESS WHEREOF, the Parties hereto have duly executed this __________________ Agreement as of the Effective Date.

    - -
    -

    PSF:

    -

    PYTHON SOFTWARE FOUNDATION,

    -

    a Delaware nonprofit corporation

    - -
    -
    - -

    By: - ___________________________________

    -
    -

    Ewa Jodlowska

    -

    Executive Director

    -
    - -
    -
    - -

    SPONSOR:

    -

    ______________________________________,

    -

    a {{ sponsor.state }} entity.

    -
    -

    By: ___________________________________

    - -
    -
    - -

    SPONSORSHIP AGREEMENT

    - -

    EXHIBIT A

    - -
      -
    1. Sponsorship. During the Term of this Agreement, in return for the Sponsorship Payment, the PSF agrees to identify and acknowledge Sponsor as a {{ start_date|date:'Y' }} {{ sponsorship.level_name }} Sponsor of the Programs and of the PSF, in accordance with the United States Internal Revenue Service guidance applicable to qualified sponsorship payments.
    2. - -

      Acknowledgments of appreciation for the Sponsorship Payment may identify and briefly describe Sponsor and its products or product lines in neutral terms and may include Sponsor’s name, logo, well-established slogan, locations, telephone numbers, or website addresses, but such acknowledgments shall not include (a) comparative or qualitative descriptions of Sponsor’s products, services, or facilities; (b) price information or other indications of savings or value associated with Sponsor’s products or services; (c) a call to action; (d) an endorsement; or (e) an inducement to buy, sell, or use Sponsor’s products or services. Any such acknowledgments will be created, or subject to prior review and approval, by the PSF.

      - -

      The PSF’s acknowledgment may include the following:

      - -
        -
      1. Display of Logo. The PSF will display Sponsor’s logo and other agreed-upon identifying information on www.python.org, and on any marketing and promotional media made by the PSF in connection with the Programs, solely for the purpose of acknowledging Sponsor as a sponsor of the Programs in a manner (placement, form, content, etc.) reasonably determined by the PSF in its sole discretion. Sponsor agrees to provide all the necessary content and materials for use in connection with such display.
      2. - -
      3. [Other use or Acknowledgement.]
      4. -
      - -
    3. Sponsorship Payment. The amount of Sponsorship Payment shall be {{ sponsorship.verbose_sponsorship_fee|title }} USD ($ {{ sponsorship.sponsorship_fee|intcomma }}). The Sponsorship Payment is due within thirty (30) days of the Effective Date. To the extent that any portion of a payment under this section would not (if made as a Separate payment) be deemed a qualified sponsorship payment under IRC § 513(i), such portion shall be deemed and treated as separate from the qualified sponsorship payment.
    4. - -
    5. Receipt of Payment. Sponsor must submit full payment in order to secure Sponsor Benefits.
    6. - -
    7. Refunds. The PSF does not offer refunds for sponsorships. The PSF may cancel the event(s) or any part thereof. In that event, the PSF shall determine and refund to Sponsor the proportionate share of the balance of the aggregate Sponsorship fees applicable to event(s) received which remain after deducting all expenses incurred by the PSF.
    8. - -
    9. Sponsor Benefits. Sponsor Benefits per the Agreement are:
    10. - -
        -
      1. Acknowledgement as described under “Sponsorship” above.
      2. - {% for benefit in benefits %} -
      3. {{ benefit }}
      4. - {% endfor %} -
      - - - {% if legal_clauses %} -
    11. Legal Clauses. Related legal clauses are:
    12. -
        - {% for clause in legal_clauses %} -
      1. {{ clause }}
      2. - {% endfor %} -
      - {% endif %} -
    - -{% endblock %} diff --git a/templates/sponsors/admin/renewal-contract-template.docx b/templates/sponsors/admin/renewal-contract-template.docx deleted file mode 100644 index 3e36801a316f85a4a0484c7b4ed1a227a9fb4285..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9323 zcma)C1yozxwhiuu;_hDD-QC@3X>kg{f;$us?iBY@+@-j?OM&99#hre*|Gj^E@Bi

    E*dJc2N$B6)ouG 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 uz+Wd(o%mnyza-?p3o*ymGZjwy)a`s>Q`g|M! diff --git a/texlive.packages b/texlive.packages new file mode 100644 index 000000000..fc8668ea0 --- /dev/null +++ b/texlive.packages @@ -0,0 +1,2 @@ +xcolor +etoolbox From f3fa1fc16a5202fa3af019240d0285001475f0f9 Mon Sep 17 00:00:00 2001 From: Hugo van Kemenade <1324225+hugovk@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:56:08 +0200 Subject: [PATCH 064/112] Prioritise 64-bit downloads over 32-bit (#2311) Co-authored-by: Hugo van Kemenade --- downloads/templatetags/download_tags.py | 34 +++++++++++++++++++++++++ templates/downloads/os_list.html | 5 ++-- templates/downloads/release_detail.html | 3 ++- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/downloads/templatetags/download_tags.py b/downloads/templatetags/download_tags.py index 57004ccb4..c72f6d58c 100644 --- a/downloads/templatetags/download_tags.py +++ b/downloads/templatetags/download_tags.py @@ -19,3 +19,37 @@ def has_sigstore_materials(files): @register.filter def has_sbom(files): return any(f.sbom_spdx2_file for f in files) + + +@register.filter +def sort_windows(files): + if not files: + return files + + # Put Windows files in preferred order + files = list(files) + windows_files = [] + other_files = [] + for preferred in ( + 'Windows installer (64-bit)', + 'Windows installer (32-bit)', + 'Windows installer (ARM64)', + 'Windows help file', + 'Windows embeddable package (64-bit)', + 'Windows embeddable package (32-bit)', + 'Windows embeddable package (ARM64)', + ): + for file in files: + if file.name == preferred: + windows_files.append(file) + files.remove(file) + break + + # Then append any remaining Windows files + for file in files: + if file.name.startswith('Windows'): + windows_files.append(file) + else: + other_files.append(file) + + return other_files + windows_files diff --git a/templates/downloads/os_list.html b/templates/downloads/os_list.html index 67db5233f..1e0177dca 100644 --- a/templates/downloads/os_list.html +++ b/templates/downloads/os_list.html @@ -1,6 +1,7 @@ {% extends "downloads/base.html" %} {% load boxes %} {% load sitetree %} +{% load sort_windows from download_tags %} {% block body_attributes %}class="python download"{% endblock %} @@ -45,7 +46,7 @@

    Stable Releases

    {% endif %} {% endif %}
      - {% for f in r.files.all %} + {% for f in r.files.all|sort_windows %}
    • Download {{ f.name }}
    • {% empty %}
    • No files for this release.
    • @@ -63,7 +64,7 @@

      Pre-releases

    • {{ r.name }} - {{ r.release_date|date }}
        - {% for f in r.files.all %} + {% for f in r.files.all|sort_windows %}
      • Download {{ f.name }}
      • {% empty %}
      • No files for this release.
      • diff --git a/templates/downloads/release_detail.html b/templates/downloads/release_detail.html index 59ffe2d7a..720887074 100644 --- a/templates/downloads/release_detail.html +++ b/templates/downloads/release_detail.html @@ -3,6 +3,7 @@ {% load sitetree %} {% load has_sigstore_materials from download_tags %} {% load has_sbom from download_tags %} +{% load sort_windows from download_tags %} {% block body_attributes %}class="python downloads"{% endblock %} @@ -60,7 +61,7 @@

        Files

        - {% for f in release_files %} + {% for f in release_files|sort_windows %} {{ f.name }} {{ f.os.name }} From f88599b49d6514168f45920a531823e22d7570d6 Mon Sep 17 00:00:00 2001 From: Dorian Adams <104034366+dorian-adams@users.noreply.github.com> Date: Wed, 21 Feb 2024 08:56:58 -0500 Subject: [PATCH 065/112] Redirect legacy community page (#2319) Use regular expression to redirect all legacy 'community-landing/' paths, including any children. --- pydotorg/urls.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pydotorg/urls.py b/pydotorg/urls.py index 5fc6b3f12..d1496dc03 100644 --- a/pydotorg/urls.py +++ b/pydotorg/urls.py @@ -54,6 +54,7 @@ name='account_change_password'), path('accounts/', include('allauth.urls')), path('box/', include('boxes.urls')), + re_path(r'^community-landing(/.*)?$', RedirectView.as_view(url='/community/', permanent=True)), path('community/', include('community.urls', namespace='community')), path('community/microbit/', TemplateView.as_view(template_name="community/microbit.html"), name='microbit'), path('events/', include('events.urls', namespace='events')), From 94e53dabe52df1195b72ec0ef6d1b84a544176ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 14:57:38 +0100 Subject: [PATCH 066/112] Bump beautifulsoup4 from 4.9.3 to 4.11.2 (#2239) Bumps [beautifulsoup4](https://www.crummy.com/software/BeautifulSoup/bs4/) from 4.9.3 to 4.11.2. --- updated-dependencies: - dependency-name: beautifulsoup4 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- base-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base-requirements.txt b/base-requirements.txt index 2495153db..71e52b024 100644 --- a/base-requirements.txt +++ b/base-requirements.txt @@ -16,7 +16,7 @@ python-decouple==3.4 lxml==4.6.3 cssselect==1.1.0 feedparser==6.0.8 -beautifulsoup4==4.9.3 +beautifulsoup4==4.11.2 icalendar==4.0.7 chardet==4.0.0 # TODO: We may drop 'django-imagekit' completely. From af64f12c30a405ed561506d71ad158894f898564 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 15:00:41 +0100 Subject: [PATCH 067/112] Bump lxml from 4.6.3 to 4.9.2 (#2212) Bumps [lxml](https://github.com/lxml/lxml) from 4.6.3 to 4.9.2. - [Release notes](https://github.com/lxml/lxml/releases) - [Changelog](https://github.com/lxml/lxml/blob/master/CHANGES.txt) - [Commits](https://github.com/lxml/lxml/compare/lxml-4.6.3...lxml-4.9.2) --- updated-dependencies: - dependency-name: lxml dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- base-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/base-requirements.txt b/base-requirements.txt index 71e52b024..06e1990e4 100644 --- a/base-requirements.txt +++ b/base-requirements.txt @@ -13,7 +13,7 @@ psycopg2-binary==2.8.6 python3-openid==3.2.0 python-decouple==3.4 # lxml used by BeautifulSoup. -lxml==4.6.3 +lxml==4.9.2 cssselect==1.1.0 feedparser==6.0.8 beautifulsoup4==4.11.2 From 8209dff476fa67cd2b129c4d9d9f7c82f5177c05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Wed, 21 Feb 2024 15:33:18 +0100 Subject: [PATCH 068/112] Revert "Move to pandoc for rendering sponsorship contracts (#2343)" (#2374) This reverts commit a4990b711ccd6e34e87d8d4b97169846fba5414f. --- .github/workflows/ci.yml | 12 - Aptfile | 0 Dockerfile | 42 +-- base-requirements.txt | 7 +- pydotorg/settings/base.py | 1 + sponsors/contracts.py | 89 ------ sponsors/pandoc_filters/__init__.py | 0 sponsors/pandoc_filters/pagebreak.py | 90 ------ sponsors/pdf.py | 78 +++++ sponsors/reference.docx | Bin 12636 -> 0 bytes sponsors/tests/test_contracts.py | 39 --- sponsors/tests/test_pdf.py | 113 +++++++ sponsors/use_cases.py | 2 +- sponsors/views_admin.py | 2 +- .../sponsors/admin/contract-template.docx | Bin 0 -> 15199 bytes .../admin/contracts/renewal-agreement.md | 119 -------- .../admin/contracts/sponsorship-agreement.md | 209 ------------- .../sponsors/admin/preview-contract.html | 283 ++++++++++++++++++ .../admin/renewal-contract-template.docx | Bin 0 -> 9323 bytes texlive.packages | 2 - 20 files changed, 483 insertions(+), 605 deletions(-) delete mode 100644 Aptfile delete mode 100644 sponsors/contracts.py delete mode 100644 sponsors/pandoc_filters/__init__.py delete mode 100644 sponsors/pandoc_filters/pagebreak.py create mode 100644 sponsors/pdf.py delete mode 100644 sponsors/reference.docx delete mode 100644 sponsors/tests/test_contracts.py create mode 100644 sponsors/tests/test_pdf.py create mode 100644 templates/sponsors/admin/contract-template.docx delete mode 100644 templates/sponsors/admin/contracts/renewal-agreement.md delete mode 100644 templates/sponsors/admin/contracts/sponsorship-agreement.md create mode 100644 templates/sponsors/admin/preview-contract.html create mode 100644 templates/sponsors/admin/renewal-contract-template.docx delete mode 100644 texlive.packages diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 28bfcc5ee..97298ffca 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -17,18 +17,6 @@ jobs: steps: - name: Check out repository uses: actions/checkout@v2 - - name: Install platform dependencies - run: | - sudo apt -y update - sudo apt -y install --no-install-recommends \ - texlive-latex-base \ - texlive-latex-recommended \ - texlive-plain-generic \ - lmodern - - name: Install pandoc - run: | - wget https://github.com/jgm/pandoc/releases/download/2.17.1.1/pandoc-2.17.1.1-1-amd64.deb - sudo dpkg -i pandoc-2.17.1.1-1-amd64.deb - uses: actions/setup-python@v2 with: python-version: 3.9.16 diff --git a/Aptfile b/Aptfile deleted file mode 100644 index e69de29bb..000000000 diff --git a/Dockerfile b/Dockerfile index f8aca13a2..4d1046a98 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,47 +1,9 @@ -FROM python:3.9-bookworm +FROM python:3.9-bullseye ENV PYTHONUNBUFFERED=1 ENV PYTHONDONTWRITEBYTECODE=1 - -# By default, Docker has special steps to avoid keeping APT caches in the layers, which -# is good, but in our case, we're going to mount a special cache volume (kept between -# builds), so we WANT the cache to persist. -RUN set -eux; \ - rm -f /etc/apt/apt.conf.d/docker-clean; \ - echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' > /etc/apt/apt.conf.d/keep-cache; - -# Install System level build requirements, this is done before -# everything else because these are rarely ever going to change. -RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ - --mount=type=cache,target=/var/lib/apt,sharing=locked \ - set -x \ - && apt-get update \ - && apt-get install --no-install-recommends -y \ - pandoc \ - texlive-latex-base \ - texlive-latex-recommended \ - texlive-fonts-recommended \ - texlive-plain-generic \ - lmodern - -RUN case $(uname -m) in \ - "x86_64") ARCH=amd64 ;; \ - "aarch64") ARCH=arm64 ;; \ - esac \ - && wget --quiet https://github.com/jgm/pandoc/releases/download/2.17.1.1/pandoc-2.17.1.1-1-${ARCH}.deb \ - && dpkg -i pandoc-2.17.1.1-1-${ARCH}.deb - RUN mkdir /code WORKDIR /code - COPY dev-requirements.txt /code/ COPY base-requirements.txt /code/ - -RUN pip --no-cache-dir --disable-pip-version-check install --upgrade pip setuptools wheel - -RUN --mount=type=cache,target=/root/.cache/pip \ - set -x \ - && pip --disable-pip-version-check \ - install \ - -r dev-requirements.txt - +RUN pip install -r dev-requirements.txt COPY . /code/ diff --git a/base-requirements.txt b/base-requirements.txt index 06e1990e4..0badc58eb 100644 --- a/base-requirements.txt +++ b/base-requirements.txt @@ -44,11 +44,12 @@ django-filter==2.4.0 django-ordered-model==3.4.3 django-widget-tweaks==1.4.8 django-countries==7.2.1 +xhtml2pdf==0.2.5 +django-easy-pdf3==0.1.2 num2words==0.5.10 django-polymorphic==3.0.0 sorl-thumbnail==12.7.0 +docxtpl==0.12.0 +reportlab==3.6.6 django-extensions==3.1.4 django-import-export==2.7.1 - -pypandoc==1.12 -panflute==2.3.0 diff --git a/pydotorg/settings/base.py b/pydotorg/settings/base.py index ccbf3acab..25874dd5d 100644 --- a/pydotorg/settings/base.py +++ b/pydotorg/settings/base.py @@ -173,6 +173,7 @@ 'ordered_model', 'widget_tweaks', 'django_countries', + 'easy_pdf', 'sorl.thumbnail', 'banners', diff --git a/sponsors/contracts.py b/sponsors/contracts.py deleted file mode 100644 index 7e72cde39..000000000 --- a/sponsors/contracts.py +++ /dev/null @@ -1,89 +0,0 @@ -import os -import tempfile - -from django.http import HttpResponse -from django.template.loader import render_to_string -from django.utils.dateformat import format - -import pypandoc - -dirname = os.path.dirname(__file__) -DOCXPAGEBREAK_FILTER = os.path.join(dirname, "pandoc_filters/pagebreak.py") -REFERENCE_DOCX = os.path.join(dirname, "reference.docx") - - -def _clean_split(text, separator="\n"): - return [ - t.replace("-", "").strip() - for t in text.split("\n") - if t.replace("-", "").strip() - ] - - -def _contract_context(contract, **context): - start_date = contract.sponsorship.start_date - context.update( - { - "contract": contract, - "start_date": start_date, - "start_day_english_suffix": format(start_date, "S"), - "sponsor": contract.sponsorship.sponsor, - "sponsorship": contract.sponsorship, - "benefits": _clean_split(contract.benefits_list.raw), - "legal_clauses": _clean_split(contract.legal_clauses.raw), - } - ) - previous_effective = contract.sponsorship.previous_effective_date - context["previous_effective"] = previous_effective if previous_effective else "UNKNOWN" - context["previous_effective_english_suffix"] = format(previous_effective, "S") if previous_effective else "UNKNOWN" - return context - - -def render_markdown_from_template(contract, **context): - template = "sponsors/admin/contracts/sponsorship-agreement.md" - if contract.sponsorship.renewal: - template = "sponsors/admin/contracts/renewal-agreement.md" - context = _contract_context(contract, **context) - return render_to_string(template, context) - - -def render_contract_to_pdf_response(request, contract, **context): - response = HttpResponse( - render_contract_to_pdf_file(contract, **context), content_type="application/pdf" - ) - return response - - -def render_contract_to_pdf_file(contract, **context): - with tempfile.NamedTemporaryFile() as docx_file: - with tempfile.NamedTemporaryFile(suffix=".pdf") as pdf_file: - markdown = render_markdown_from_template(contract, **context) - pdf = pypandoc.convert_text( - markdown, "pdf", outputfile=pdf_file.name, format="md" - ) - return pdf_file.read() - - -def render_contract_to_docx_response(request, contract, **context): - response = HttpResponse( - render_contract_to_docx_file(contract, **context), - content_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document", - ) - response[ - "Content-Disposition" - ] = f"attachment; filename={'sponsorship-renewal' if contract.sponsorship.renewal else 'sponsorship-contract'}-{contract.sponsorship.sponsor.name.replace(' ', '-').replace('.', '')}.docx" - return response - - -def render_contract_to_docx_file(contract, **context): - markdown = render_markdown_from_template(contract, **context) - with tempfile.NamedTemporaryFile() as docx_file: - docx = pypandoc.convert_text( - markdown, - "docx", - outputfile=docx_file.name, - format="md", - filters=[DOCXPAGEBREAK_FILTER], - extra_args=[f"--reference-doc", REFERENCE_DOCX], - ) - return docx_file.read() diff --git a/sponsors/pandoc_filters/__init__.py b/sponsors/pandoc_filters/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/sponsors/pandoc_filters/pagebreak.py b/sponsors/pandoc_filters/pagebreak.py deleted file mode 100644 index 525b89c57..000000000 --- a/sponsors/pandoc_filters/pagebreak.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- - -# ------------------------------------------------------------------------------ -# Source: https://github.com/pandocker/pandoc-docx-pagebreak-py/ -# Revision: c8cddccebb78af75168da000a3d6ac09349bef73 -# ------------------------------------------------------------------------------ -# MIT License -# -# Copyright (c) 2018 pandocker -# -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to deal -# in the Software without restriction, including without limitation the rights -# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -# copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. -# ------------------------------------------------------------------------------ - -""" pandoc-docx-pagebreakpy -Pandoc filter to insert pagebreak as openxml RawBlock -Only for docx output - -Trying to port pandoc-doc-pagebreak -- https://github.com/alexstoick/pandoc-docx-pagebreak -""" - -import panflute as pf - - -class DocxPagebreak(object): - pagebreak = pf.RawBlock("", format="openxml") - sectionbreak = pf.RawBlock("", - format="openxml") - toc = pf.RawBlock(r""" - - - - - - TOC \o "1-3" \h \z \u - - - - - - -""", format="openxml") - - def action(self, elem, doc): - if isinstance(elem, pf.RawBlock): - if elem.text == r"\newpage": - if (doc.format == "docx"): - pf.debug("Page Break") - elem = self.pagebreak - # elif elem.text == r"\newsection": - # if (doc.format == "docx"): - # pf.debug("Section Break") - # elem = self.sectionbreak - # else: - # elem = [] - elif elem.text == r"\toc": - if (doc.format == "docx"): - pf.debug("Table of Contents") - para = [pf.Para(pf.Str("Table"), pf.Space(), pf.Str("of"), pf.Space(), pf.Str("Contents"))] - div = pf.Div(*para, attributes={"custom-style": "TOC Heading"}) - elem = [div, self.toc] - else: - elem = [] - return elem - - -def main(doc=None): - dp = DocxPagebreak() - return pf.run_filter(dp.action, doc=doc) - - -if __name__ == "__main__": - main() diff --git a/sponsors/pdf.py b/sponsors/pdf.py new file mode 100644 index 000000000..9855beee3 --- /dev/null +++ b/sponsors/pdf.py @@ -0,0 +1,78 @@ +""" +This module is a wrapper around django-easy-pdf so we can reuse code +""" +import io +import os +from django.conf import settings +from django.http import HttpResponse +from django.utils.dateformat import format + +from docxtpl import DocxTemplate +from easy_pdf.rendering import render_to_pdf_response, render_to_pdf + +from markupfield_helpers.helpers import render_md +from django.utils.html import mark_safe + + +def _clean_split(text, separator='\n'): + return [ + t.replace('-', '').strip() + for t in text.split('\n') + if t.replace('-', '').strip() + ] + + +def _contract_context(contract, **context): + start_date = contract.sponsorship.start_date + context.update({ + "contract": contract, + "start_date": start_date, + "start_day_english_suffix": format(start_date, "S"), + "sponsor": contract.sponsorship.sponsor, + "sponsorship": contract.sponsorship, + "benefits": _clean_split(contract.benefits_list.raw), + "legal_clauses": _clean_split(contract.legal_clauses.raw), + "renewal": contract.sponsorship.renewal, + }) + previous_effective = contract.sponsorship.previous_effective_date + context["previous_effective"] = previous_effective if previous_effective else "UNKNOWN" + context["previous_effective_english_suffix"] = format(previous_effective, "S") if previous_effective else None + return context + + +def render_contract_to_pdf_response(request, contract, **context): + template = "sponsors/admin/preview-contract.html" + context = _contract_context(contract, **context) + return render_to_pdf_response(request, template, context) + + +def render_contract_to_pdf_file(contract, **context): + template = "sponsors/admin/preview-contract.html" + context = _contract_context(contract, **context) + return render_to_pdf(template, context) + + +def _gen_docx_contract(output, contract, **context): + context = _contract_context(contract, **context) + renewal = context["renewal"] + if renewal: + template = os.path.join(settings.TEMPLATES_DIR, "sponsors", "admin", "renewal-contract-template.docx") + else: + template = os.path.join(settings.TEMPLATES_DIR, "sponsors", "admin", "contract-template.docx") + doc = DocxTemplate(template) + doc.render(context) + doc.save(output) + return output + + +def render_contract_to_docx_response(request, contract, **context): + response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document') + response['Content-Disposition'] = 'attachment; filename=contract.docx' + return _gen_docx_contract(output=response, contract=contract, **context) + + +def render_contract_to_docx_file(contract, **context): + fp = io.BytesIO() + fp = _gen_docx_contract(output=fp, contract=contract, **context) + fp.seek(0) + return fp.read() diff --git a/sponsors/reference.docx b/sponsors/reference.docx deleted file mode 100644 index bf094ca4f3f29b535da99c765b735eaee71420d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12636 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%0D(b%B@_FB(DPPG z&0-g(r3Rwn9F|ya1EjZf5p!cs^V5e5ZrET>?rO&LZgV<8>y|PaqQ=B8^hbNN#5@lG z0asUMKV77q?P6^*ryGXhe|7wL{4^-TYsU*g{?my6?{RnDL<%&%Rsewdqhdk#28DJ-dJc@MXwm#QOhEI1QdJ= zw+08&iV{+vYD)Ju&N{VUf0P7KmtpWi7ursN&SVQ)f$~RDk1=CqiBf_jvQG~b*O=CK zV3KAQLC4&IfxT~*kvnG%bXdDXpTFaQ-8)tQLGU>*qRLSx*I9R^xi-j4EM;a@4fV_M z=;yL$-Whpw-}3U2q)2lT2nm~`#`MbwIa^}|*lDs`in=xFY-z+XKz5-;T8E>9rKX#g z>-^fmKz7f25wC!%-DGwc6lQ)iXrmfORRo5Eedxs1pSC5{%MOX=wWp!}ubewA;a7+K zx@V-P>}F@;sPoecw@6#F=%S?N!;BwtzIKqtH5W3uX-;nT zlewkvbhrB8XW({gOBU!eI)sOecHd@EhQfxQ&jpbg?wV{`kxqv7J#0Tsi zhakfr$2j}4mb2PWz>AYFt;4HLx36?bs(bBRS4YEs(Ep8C4^55|`XO7b1`U=B- zMjiO^A(Kjq%7+I}B!-|f6P_}{B((Rd0>$Rn5#KY0O*l4aU7y1YX(UsB%r)M08I|3M z`dB?YzXhVZON#HBu7PLuMGVnIKU_AV>8XR-@@=~p^3WTA{0}L0m_50C<_`=PKSVZV zTWzKh2qZ=`^sPMGQD6qlt_e??PMEAqxP`lEo_9UY3Fka{ynMv%8SFvWM^j^U!T-l#<8{R#hl jTK;_ySJ8lg{2wf=ycFc?@B#rre*HCrzeXZ-Kd=55B-B^E diff --git a/sponsors/tests/test_contracts.py b/sponsors/tests/test_contracts.py deleted file mode 100644 index c330c13a8..000000000 --- a/sponsors/tests/test_contracts.py +++ /dev/null @@ -1,39 +0,0 @@ -from datetime import date -from model_bakery import baker -from unittest.mock import patch, Mock - -from django.http import HttpRequest -from django.test import TestCase -from django.utils.dateformat import format - -from sponsors.contracts import render_contract_to_docx_response - - -class TestRenderContract(TestCase): - def setUp(self): - self.contract = baker.make_recipe("sponsors.tests.empty_contract", sponsorship__start_date=date.today()) - - # DOCX unit test - def test_render_response_with_docx_attachment(self): - request = Mock(HttpRequest) - self.contract.sponsorship.renewal = False - response = render_contract_to_docx_response(request, self.contract) - - self.assertEqual(response.get("Content-Disposition"), "attachment; filename=sponsorship-contract-Sponsor.docx") - self.assertEqual( - response.get("Content-Type"), - "application/vnd.openxmlformats-officedocument.wordprocessingml.document" - ) - - - # DOCX unit test - def test_render_renewal_response_with_docx_attachment(self): - request = Mock(HttpRequest) - self.contract.sponsorship.renewal = True - response = render_contract_to_docx_response(request, self.contract) - - self.assertEqual(response.get("Content-Disposition"), "attachment; filename=sponsorship-renewal-Sponsor.docx") - self.assertEqual( - response.get("Content-Type"), - "application/vnd.openxmlformats-officedocument.wordprocessingml.document" - ) diff --git a/sponsors/tests/test_pdf.py b/sponsors/tests/test_pdf.py new file mode 100644 index 000000000..e4d140cf2 --- /dev/null +++ b/sponsors/tests/test_pdf.py @@ -0,0 +1,113 @@ +from datetime import date +from docxtpl import DocxTemplate +from markupfield_helpers.helpers import render_md +from model_bakery import baker +from pathlib import Path +from unittest.mock import patch, Mock + +from django.conf import settings +from django.http import HttpResponse, HttpRequest +from django.template.loader import render_to_string +from django.test import TestCase +from django.utils.html import mark_safe +from django.utils.dateformat import format + +from sponsors.pdf import render_contract_to_pdf_file, render_contract_to_pdf_response, render_contract_to_docx_response + + +class TestRenderContract(TestCase): + def setUp(self): + self.contract = baker.make_recipe("sponsors.tests.empty_contract", sponsorship__start_date=date.today()) + text = f"{self.contract.benefits_list.raw}\n\n**Legal Clauses**\n{self.contract.legal_clauses.raw}" + html = render_md(text) + self.context = { + "contract": self.contract, + "start_date": self.contract.sponsorship.start_date, + "start_day_english_suffix": format(self.contract.sponsorship.start_date, "S"), + "sponsor": self.contract.sponsorship.sponsor, + "sponsorship": self.contract.sponsorship, + "benefits": [], + "legal_clauses": [], + "renewal": None, + "previous_effective": "UNKNOWN", + "previous_effective_english_suffix": None, + } + self.template = "sponsors/admin/preview-contract.html" + + # PDF unit tests + @patch("sponsors.pdf.render_to_pdf") + def test_render_pdf_using_django_easy_pdf(self, mock_render): + mock_render.return_value = "pdf content" + + content = render_contract_to_pdf_file(self.contract) + + self.assertEqual(content, "pdf content") + mock_render.assert_called_once_with(self.template, self.context) + + @patch("sponsors.pdf.render_to_pdf_response") + def test_render_response_using_django_easy_pdf(self, mock_render): + response = Mock(HttpResponse) + mock_render.return_value = response + + request = Mock(HttpRequest) + content = render_contract_to_pdf_response(request, self.contract) + + self.assertEqual(content, response) + mock_render.assert_called_once_with(request, self.template, self.context) + + # DOCX unit test + @patch("sponsors.pdf.DocxTemplate") + def test_render_response_with_docx_attachment(self, MockDocxTemplate): + template = Path(settings.TEMPLATES_DIR) / "sponsors" / "admin" / "contract-template.docx" + self.assertTrue(template.exists()) + mocked_doc = Mock(DocxTemplate) + MockDocxTemplate.return_value = mocked_doc + + request = Mock(HttpRequest) + response = render_contract_to_docx_response(request, self.contract) + + MockDocxTemplate.assert_called_once_with(str(template.resolve())) + mocked_doc.render.assert_called_once_with(self.context) + mocked_doc.save.assert_called_once_with(response) + self.assertEqual(response.get("Content-Disposition"), "attachment; filename=contract.docx") + self.assertEqual( + response.get("Content-Type"), + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + ) + + @patch("sponsors.pdf.DocxTemplate") + def test_render_response_with_docx_attachment__renewal(self, MockDocxTemplate): + renewal_contract = baker.make_recipe("sponsors.tests.empty_contract", sponsorship__start_date=date.today(), + sponsorship__renewal=True) + text = f"{renewal_contract.benefits_list.raw}\n\n**Legal Clauses**\n{renewal_contract.legal_clauses.raw}" + html = render_md(text) + renewal_context = { + "contract": renewal_contract, + "start_date": renewal_contract.sponsorship.start_date, + "start_day_english_suffix": format(self.contract.sponsorship.start_date, "S"), + "sponsor": renewal_contract.sponsorship.sponsor, + "sponsorship": renewal_contract.sponsorship, + "benefits": [], + "legal_clauses": [], + "renewal": True, + "previous_effective": "UNKNOWN", + "previous_effective_english_suffix": None, + } + renewal_template = "sponsors/admin/preview-contract.html" + + template = Path(settings.TEMPLATES_DIR) / "sponsors" / "admin" / "renewal-contract-template.docx" + self.assertTrue(template.exists()) + mocked_doc = Mock(DocxTemplate) + MockDocxTemplate.return_value = mocked_doc + + request = Mock(HttpRequest) + response = render_contract_to_docx_response(request, renewal_contract) + + MockDocxTemplate.assert_called_once_with(str(template.resolve())) + mocked_doc.render.assert_called_once_with(renewal_context) + mocked_doc.save.assert_called_once_with(response) + self.assertEqual(response.get("Content-Disposition"), "attachment; filename=contract.docx") + self.assertEqual( + response.get("Content-Type"), + "application/vnd.openxmlformats-officedocument.wordprocessingml.document" + ) diff --git a/sponsors/use_cases.py b/sponsors/use_cases.py index 91271ff64..bbb6f2483 100644 --- a/sponsors/use_cases.py +++ b/sponsors/use_cases.py @@ -3,7 +3,7 @@ from sponsors import notifications from sponsors.models import Sponsorship, Contract, SponsorContact, SponsorEmailNotificationTemplate, SponsorshipBenefit, \ SponsorshipPackage -from sponsors.contracts import render_contract_to_pdf_file, render_contract_to_docx_file +from sponsors.pdf import render_contract_to_pdf_file, render_contract_to_docx_file class BaseUseCaseWithNotifications: diff --git a/sponsors/views_admin.py b/sponsors/views_admin.py index fd8631d3f..e9a808ccc 100644 --- a/sponsors/views_admin.py +++ b/sponsors/views_admin.py @@ -14,7 +14,7 @@ from sponsors.forms import SponsorshipReviewAdminForm, SponsorshipsListForm, SignedSponsorshipReviewAdminForm, \ SendSponsorshipNotificationForm, CloneApplicationConfigForm from sponsors.exceptions import InvalidStatusException -from sponsors.contracts import render_contract_to_pdf_response, render_contract_to_docx_response +from sponsors.pdf import render_contract_to_pdf_response, render_contract_to_docx_response from sponsors.models import Sponsorship, SponsorBenefit, EmailTargetable, SponsorContact, BenefitFeature, \ SponsorshipCurrentYear, SponsorshipBenefit, SponsorshipPackage diff --git a/templates/sponsors/admin/contract-template.docx b/templates/sponsors/admin/contract-template.docx new file mode 100644 index 0000000000000000000000000000000000000000..5bdc44525a4d15367bcaad989f5d63ba6c278233 GIT binary patch literal 15199 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 literal 0 HcmV?d00001 diff --git a/templates/sponsors/admin/contracts/renewal-agreement.md b/templates/sponsors/admin/contracts/renewal-agreement.md deleted file mode 100644 index 3a401c9d7..000000000 --- a/templates/sponsors/admin/contracts/renewal-agreement.md +++ /dev/null @@ -1,119 +0,0 @@ ---- -title: SPONSORSHIP AGREEMENT RENEWAL -geometry: -- margin=1.25in -font-size: 12pt -pagestyle: empty -header-includes: -- \pagenumbering{gobble} ---- - -**THIS SPONSORSHIP AGREEMENT RENEWAL** (the **"Agreement"**) -is entered into and made effective as of the -{{start_date|date:"j"}}{{start_day_english_suffix}} of {{start_date|date:"F Y"}} -(the **"Effective Date"**), -by and between the **Python Software Foundation** (the **"PSF"**), -a Delaware nonprofit corporation, -and **{{sponsor.name|upper}}** (**"Sponsor"**), -a {{sponsor.state}} corporation. -Each of the PSF and Sponsor are hereinafter sometimes individually -referred to as a **"Party"** and collectively as the **"Parties"**. - -## RECITALS - -**WHEREAS**, the PSF is a tax-exempt charitable organization (EIN 04-3594598) -whose mission is to promote, protect, and advance the Python programming language, -and to support and facilitate the growth of a diverse -and international community of Python programmers (the **"Programs"**); - -**WHEREAS**, Sponsor is {{contract.sponsor_info}}; and - -**WHEREAS**, Sponsor and the PSF previously entered into a Sponsorship Agreement -with the effective date of the -{{ previous_effective|date:"j" }}{{ previous_effective_english_suffix }} of {{ previous_effective|date:"F Y" }} -and a term of one year (the “Sponsorship Agreement”). - -**WHEREAS**, Sponsor wishes to renew its support the Programs by making a contribution to the PSF. - -## AGREEMENT - -**NOW, THEREFORE**, in consideration of the foregoing and the mutual covenants contained herein, and for other good and valuable consideration, the receipt and sufficiency of which are hereby acknowledged, the Parties hereto agree to extend and amend the Sponsorship Agreement as follows: - -1. [**Replacement of the Exhibit**]{.underline} Exhibit A to the Sponsorship Agreement is replaced with Exhibit A below. - -1. [**Renewal**]{.underline} Approval and incorporation of this new exhibit with the previous Sponsor Benefits shall be considered written notice by Sponsor to the PSF that you wish to continue the terms of the Sponsorship Agreement for an additional year and to contribute the new Sponsorship Payment specified in Exhibit A, beginning on the Effective Date, as contemplated by Section 6 of the Sponsorship Agreement. - -  - - -### \[Signature Page Follows\] - -::: {.page-break} -\newpage -::: - -## SPONSORSHIP AGREEMENT RENEWAL - -**IN WITNESS WHEREOF**, the Parties hereto have duly executed this **Sponsorship Agreement Renewal** as of the **Effective Date**. - -  - -**PSF**: -**PYTHON SOFTWARE FOUNDATION**, -a Delaware non profit corporation - -  - -By:        ________________________________ -Name:   Loren Crary -Title:     Director of Resource Development - -  - -  - -**SPONSOR**: -**{{sponsor.name|upper}}**, -a {{sponsor.state}} entity - -  - -By:        ________________________________ -Name:   ________________________________ -Title:     ________________________________ - -::: {.page-break} -\newpage -::: - -## SPONSORSHIP AGREEMENT RENEWAL - -### EXHIBIT A - -1. [**Sponsorship**]{.underline} During the Term of this Agreement, in return for the Sponsorship Payment, the PSF agrees to identify and acknowledge Sponsor as a {{sponsorship.year}} {{sponsorship.level_name}} Sponsor of the Programs and of the PSF, in accordance with the United States Internal Revenue Service guidance applicable to qualified sponsorship payments. - - Acknowledgments of appreciation for the Sponsorship Payment may identify and briefly describe Sponsor and its products or product lines in neutral terms and may include Sponsor’s name, logo, well-established slogan, locations, telephone numbers, or website addresses, but such acknowledgments shall not include (a) comparative or qualitative descriptions of Sponsor’s products, services, or facilities; (b) price information or other indications of savings or value associated with Sponsor’s products or services; (c) a call to action; (d) an endorsement; or (e) an inducement to buy, sell, or use Sponsor’s products or services. Any such acknowledgments will be created, or subject to prior review and approval, by the PSF. - - The PSF’s acknowledgment may include the following: - - - [**Display of Logo**]{.underline} The PSF will display Sponsor’s logo and other agreed-upon identifying information on www.python.org, and on any marketing and promotional media made by the PSF in connection with the Programs, solely for the purpose of acknowledging Sponsor as a sponsor of the Programs in a manner (placement, form, content, etc.) reasonably determined by the PSF in its sole discretion. Sponsor agrees to provide all the necessary content and materials for use in connection with such display. - - - Additional acknowledgment as provided in Sponsor Benefits. - -1. [**Sponsorship Payment**]{.underline} The amount of Sponsorship Payment shall be {{sponsorship.verbose_sponsorship_fee|title}} USD ($ {{sponsorship.sponsorship_fee}}). The Sponsorship Payment is due within thirty (30) days of the Effective Date. To the extent that any portion of a payment under this section would not (if made as a Separate payment) be deemed a qualified sponsorship payment under IRC § 513(i), such portion shall be deemed and treated as separate from the qualified sponsorship payment. - -1. [**Receipt of Payment**]{.underline} Sponsor must submit full payment in order to secure Sponsor Benefits. - -1. [**Refunds**]{.underline} The PSF does not offer refunds for sponsorships. The PSF may cancel the event(s) or any part thereof. In that event, the PSF shall determine and refund to Sponsor the proportionate share of the balance of the aggregate Sponsorship fees applicable to event(s) received which remain after deducting all expenses incurred by the PSF. - -1. [**Sponsor Benefits**]{.underline} Sponsor Benefits per the Agreement are: - - 1. Acknowledgement as described under "Sponsorship" above. - -{%for benefit in benefits%} 1. {{benefit}} -{%endfor%} - -{%if legal_clauses%}1. Legal Clauses. Related legal clauses are: - -{%for clause in legal_clauses%} 1. {{clause}} -{%endfor%}{%endif%} diff --git a/templates/sponsors/admin/contracts/sponsorship-agreement.md b/templates/sponsors/admin/contracts/sponsorship-agreement.md deleted file mode 100644 index ee0d91ce3..000000000 --- a/templates/sponsors/admin/contracts/sponsorship-agreement.md +++ /dev/null @@ -1,209 +0,0 @@ ---- -title: SPONSORSHIP AGREEMENT -geometry: -- margin=1.25in -font-size: 12pt -pagestyle: empty -header-includes: -- \pagenumbering{gobble} ---- - -**THIS SPONSORSHIP AGREEMENT** (the **"Agreement"**) -is entered into and made effective as of the -{{start_date|date:"j"}}{{start_day_english_suffix}} of {{start_date|date:"F Y"}} -(the **"Effective Date"**), -by and between the **Python Software Foundation** (the **"PSF"**), -a Delaware nonprofit corporation, -and **{{sponsor.name|upper}}** (**"Sponsor"**), -a {{sponsor.state}} corporation. -Each of the PSF and Sponsor are hereinafter sometimes individually -referred to as a **"Party"** and collectively as the **"Parties"**. - -## RECITALS - -**WHEREAS**, the PSF is a tax-exempt charitable organization (EIN 04-3594598) -whose mission is to promote, protect, and advance the Python programming language, -and to support and facilitate the growth of a diverse -and international community of Python programmers (the **"Programs"**); - -**WHEREAS**, Sponsor is {{contract.sponsor_info}}; and - -**WHEREAS**, Sponsor wishes to support the Programs by making a contribution to the PSF. - -## AGREEMENT - -**NOW, THEREFORE**, in consideration of the foregoing and the mutual covenants contained herein, and for other good and valuable consideration, the receipt and sufficiency of which are hereby acknowledged, the Parties hereto agree as follows: - -1. [**Recitals Incorporated**]{.underline}. Each of the above Recitals is incorporated into and is made a part of this Agreement. - -1. [**Exhibits Incorporated by Reference**]{.underline}. All exhibits referenced in this Agreement are incorporated herein as integral parts of this Agreement and shall be considered reiterated herein as fully as if such provisions had been set forth verbatim in this Agreement. - -1. [**Sponsorship Payment**]{.underline} In consideration for the right to sponsor the PSF and its Programs, and to be acknowledged by the PSF as a sponsor in the manner described herein, Sponsor shall make a contribution to the PSF (the "Sponsorship Payment") in the amount shown in Exhibit A. - -1. [**Acknowledgement of Sponsor**]{.underline} In return for the Sponsorship Payment, Sponsor will be entitled to receive the sponsorship package described in Exhibit A attached hereto (the "Sponsor Benefits"). - -1. [**Intellectual Property**]{.underline} The PSF is the sole owner of all right, title, and interest to all the PSF information, including the PSF’s logo, trademarks, trade names, and copyrighted information, unless otherwise provided. - - (a) [Grant of License by the PSF]{.underline} The PSF hereby grants to Sponsor a limited, non- exclusive license to use certain of the PSF’s intellectual property, including the PSF’s name, acronym, and logo (collectively, the "PSF Intellectual Property"), solely in connection with promotion of Sponsor’s sponsorship of the Programs. Sponsor agrees that it shall not use the PSF’s Property in a manner that states or implies that the PSF endorses Sponsor (or Sponsor’s products or services). The PSF retains the right, in its sole and absolute discretion, to review and approve in advance all uses of the PSF Intellectual Property, which approval shall not be unreasonably withheld. - - (a) [Grant of License by Sponsor]{.underline} Sponsor hereby grants to the PSF a limited, non-exclusive license to use certain of Sponsor’s intellectual property, including names, trademarks, and copyrights (collectively, "Sponsor Intellectual Property"), solely to identify Sponsor as a sponsor of the Programs and the PSF. Sponsor retains the right to review and approve in advance all uses of the Sponsor Intellectual Property, which approval shall not be unreasonably withheld. - -1. [**Term**]{.underline} The Term of this Agreement will begin on the Effective Date and continue for a period of one (1) year. The Agreement may be renewed for one (1) year by written notice from Sponsor to the PSF. - -1. [**Termination**]{.underline} The Agreement may be terminated (i) by either Party for any reason upon sixty (60) days prior written notice to the other Party; (ii) if one Party notifies the other Party that the other Party is in material breach of its obligations under this Agreement and such breach (if curable) is not cured with fifteen (15) days of such notice; (iii) if both Parties agree to terminate by mutual written consent; or (iv) if any of Sponsor information is found or is reasonably alleged to violate the rights of a third party. The PSF shall also have the unilateral right to terminate this Agreement at any time if it reasonably determines that it would be detrimental to the reputation and goodwill of the PSF or the Programs to continue to accept or use funds from Sponsor. Upon expiration or termination, no further use may be made by either Party of the other’s name, marks, logo or other intellectual property without the express prior written authorization of the other Party. - -1. [**Code of Conduct**]{.underline} Sponsor and all of its representatives shall conduct themselves at all times in accordance with the Python Software Foundation Code of Conduct (https://www.python.org/psf/conduct) and/or the PyCon Code of Conduct (https://pycon.us/code-of-conduct), as applicable. The PSF reserves the right to eject from any event any Sponsor or representative violating those standards. - -1. [**Deadlines**]{.underline} Company logos, descriptions, banners, advertising pages, tote bag inserts and similar items and information must be provided by the applicable deadlines for inclusion in the promotional materials for the PSF. - -1. [**Assignment of Space**]{.underline} If the Sponsor Benefits in Exhibit A include a booth or other display space, the PSF shall assign display space to Sponsor for the period of the display. Location assignments will be on a first-come, first-served basis and will be made solely at the discretion of the PSF. Failure to use a reserved space will result in penalties (up to 50% of your Sponsorship Payment). - -1. [**Job Postings**]{.underline} Sponsor will ensure that any job postings to be published by the PSF on Sponsor’s behalf comply with all applicable municipal, state, provincial, and federal laws. - -1. [**Representations and Warranties**]{.underline} Each Party represents and warrants for the benefit of the other Party that it has the legal authority to enter into this Agreement and is able to comply with the terms herein. Sponsor represents and warrants for the benefit of the PSF that it has full right and title to the Sponsor Intellectual Property to be provided under this Agreement and is not under any obligation to any party that restricts the Sponsor Intellectual Property or would prevent Sponsor’s performance under this Agreement. - -1. [**Successors and Assigns**]{.underline} This Agreement and all the terms and provisions hereof shall be binding upon and inure to the benefit of the Parties and their respective legal representatives, heirs, successors, and/or assigns. The transfer, or any attempted assignment or transfer, of all or any portion of this Agreement by a Party without the prior written consent of the other Party shall be null and void and of no effect. - -1. [**No Third-Party Beneficiaries**]{.underline} This Agreement is not intended to benefit and shall not be construed to confer upon any person, other than the Parties, any rights, remedies, or other benefits, including but not limited to third-party beneficiary rights. - -1. [**Severability**]{.underline} If any one or more of the provisions of this Agreement shall be held to be invalid, illegal, or unenforceable, the validity, legality, or enforceability of the remaining provisions of this Agreement shall not be affected thereby. To the extent permitted by applicable law, each Party waives any provision of law which renders any provision of this Agreement invalid, illegal, or unenforceable in any respect. - -1. [**Confidential Information**]{.underline} As used herein, "Confidential Information" means all confidential information disclosed by a Party ("Disclosing Party") to the other Party ("Receiving Party"), whether orally or in writing, that is designated as confidential or that reasonably should be understood to be confidential given the nature of the information. Each Party agrees: (a) to observe complete confidentiality with respect to the Confidential Information of the Disclosing Party; (b) not to disclose, or permit any third party or entity access to disclose, the Confidential Information (or any portion thereof) of the Disclosing Party without prior written permission of Disclosing Party; and (c) to ensure that any employees, or any third parties who receive access to the Confidential Information, are advised of the confidential and proprietary nature thereof and are prohibited from disclosing the Confidential Information and using the Confidential Information other than for the benefit of the Receiving Party in accordance with this Agreement. Without limiting the foregoing, each Party shall use the same degree of care that it uses to protect the confidentiality of its own confidential information of like kind, but in no event less than reasonable care. Neither Party shall have any liability with respect to Confidential Information to the extent such information: (w) is or becomes publicly available (other than through a breach of this Agreement); (x) is or becomes available to the Receiving Party on a non-confidential basis, provided that the source of such information was not known by the Receiving Party (after such inquiry as would be reasonable in the circumstances) to be the subject of a confidentiality agreement or other legal or contractual obligation of confidentiality with respect to such information; (y) is developed by the Receiving Party independently and without reference to information provided by the Disclosing Party; or (z) is required to be disclosed by law or court order, provided the Receiving Party gives the Disclosing Party prior notice of such compelled disclosure (to the extent legally permitted) and reasonable assistance, at the Disclosing Party’s cost. - -1. [**Independent Contractors**]{.underline} Nothing contained herein shall constitute or be construed as the creation of any partnership, agency, or joint venture relationship between the Parties. Neither of the Parties shall have the right to obligate or bind the other Party in any manner whatsoever, and nothing herein contained shall give or is intended to give any rights of any kind to any third party. The relationship of the Parties shall be as independent contractors. - -1. [**Indemnification**]{.underline} Sponsor agrees to indemnify and hold harmless the PSF, its officers, directors, employees, and agents, for any and all claims, losses, damages, liabilities, judgments, or settlements, including reasonable attorneys’ fees, costs (including costs associated with any official investigations or inquiries) and other expenses, incurred on account of Sponsor’s acts or omissions in connection with the performance of this Agreement or breach of this Agreement or with respect to the manufacture, marketing, sale, or dissemination of any of Sponsor’s products or services. The PSF shall have no liability to Sponsor with respect to its participation in this Agreement or receipt of the Sponsorship Payment, except for intentional or willful acts of the PSF or its employees or agents. The rights and responsibilities established in this section shall survive indefinitely beyond the term of this Agreement. - -1. [**Notices**]{.underline} All notices or other communications to be given or delivered under the provisions of this Agreement shall be in writing and shall be mailed by certified or registered mail, return receipt requested, or given or delivered by reputable courier, facsimile, or electronic mail to the Party to receive notice at the following addresses or at such other address as any Party may by notice direct in accordance with this Section: - - - If to Sponsor: - - > {{sponsor.primary_contact.name}} - > {{sponsor.name}} - > {{sponsor.mailing_address_line_1}}{%if sponsor.mailing_address_line_2%} - > {{sponsor.mailing_address_line_2 }}{% endif %} - > {{sponsor.city}}, {{sponsor.state}} {{sponsor.postal_code}} {{sponsor.country}} - > Facsimile: {{sponsor.primary_contact.phone}} - > Email: {{sponsor.primary_contact.email}} - -   - - If to the PSF: - - > Deb Nicholson - > Executive Director - > Python Software Foundation - > 9450 SW Gemini Dr. ECM # 90772 - > Beaverton, OR 97008 USA - > Facsimile: +1 (858) 712-8966 - > Email: deb@python.org - -   - - With a copy to: - - > Archer & Greiner, P.C. - > Attention: Noel Fleming - > Three Logan Square - > 1717 Arch Street, Suite 3500 - > Philadelphia, PA 19103 USA - > Facsimile: (215) 963-9999 - > Email: nfleming@archerlaw.com - -   - - Notices given by registered or certified mail shall be deemed as given on the delivery date shown on the return receipt, and notices given in any other manner shall be deemed as given when received. - -1. [**Governing Law; Jurisdiction**]{.underline} This Agreement shall be construed in accordance with the laws of the State of Delaware, without regard to its conflicts of law principles. Jurisdiction and venue for litigation of any dispute, controversy, or claim arising out of or in connection with this Agreement shall be only in a United States federal court in Delaware or a Delaware state court having subject matter jurisdiction. Each of the Parties hereto hereby expressly submits to the personal jurisdiction of the foregoing courts located in Delaware and hereby waives any objection or defense based on personal jurisdiction or venue that might otherwise be asserted to proceedings in such courts. - -1. [**Force Majeure**]{.underline} The PSF shall not be liable for any failure or delay in performing its obligations hereunder if such failure or delay is due in whole or in part to any cause beyond its reasonable control or the reasonable control of its contractors, agents, or suppliers, including, but not limited to, strikes, or other labor disturbances, acts of God, acts of war or terror, floods, sabotage, fire, natural, or other disasters, including pandemics. To the extent the PSF is unable to substantially perform hereunder due to any cause beyond its control as contemplated herein, it may terminate this Agreement as it may decide in its sole discretion. To the extent the PSF so terminates the Agreement, Sponsor releases the PSF and waives any claims for damages or compensation on account of such termination. - -1. [**No Waiver**]{.underline} A waiver of any breach of any provision of this Agreement shall not be deemed a waiver of any repetition of such breach or in any manner affect any other terms of this Agreement. - -1. [**Limitation of Damages**]{.underline} Except as otherwise provided herein, neither Party shall be liable to the other for any consequential, incidental, or punitive damages for any claims arising directly or indirectly out of this Agreement. - -1. [**Cumulative Remedies**]{.underline} All rights and remedies provided in this Agreement are cumulative and not exclusive, and the exercise by either Party of any right or remedy does not preclude the exercise of any other rights or remedies that may now or subsequently be available at law, in equity, by statute, in any other agreement between the Parties, or otherwise. - -1. [**Captions**]{.underline} The captions and headings are included herein for convenience and do not constitute a part of this Agreement. - -1. [**Amendments**]{.underline} No addition to or change in the terms of this Agreement will be binding on any Party unless set forth in writing and executed by both Parties. - -1. [**Counterparts**]{.underline} This Agreement may be executed in one or more counterparts, each of which shall be deemed an original and all of which shall be taken together and deemed to be one instrument. A signed copy of this Agreement delivered by facsimile, electronic mail, or other means of electronic transmission shall be deemed to have the same legal effect as delivery of an original signed copy of this Agreement. - -1. [**Entire Agreement**]{.underline} This Agreement (including the Exhibits) sets forth the entire agreement of the Parties and supersedes all prior oral or written agreements or understandings between the Parties as to the subject matter of this Agreement. Except as otherwise expressly provided herein, neither Party is relying upon any warranties, representations, assurances, or inducements of the other Party. - -  - - -### \[Signature Page Follows\] - -::: {.page-break} -\newpage -::: - -## SPONSORSHIP AGREEMENT - -**IN WITNESS WHEREOF**, the Parties hereto have duly executed this **Sponsorship Agreement** as of the **Effective Date**. - -  - -> **PSF**: -> **PYTHON SOFTWARE FOUNDATION**, -> a Delaware non profit corporation - -  - -> By:        ________________________________ -> Name:   Loren Crary -> Title:     Director of Resource Development - -  - -  - -> **SPONSOR**: -> **{{sponsor.name|upper}}**, -> a {{sponsor.state}} entity - -  - -> By:        ________________________________ -> Name:   ________________________________ -> Title:     ________________________________ - -::: {.page-break} -\newpage -::: - -## SPONSORSHIP AGREEMENT - -### EXHIBIT A - -1. [**Sponsorship**]{.underline} During the Term of this Agreement, in return for the Sponsorship Payment, the PSF agrees to identify and acknowledge Sponsor as a {{sponsorship.year}} {{sponsorship.level_name}} Sponsor of the Programs and of the PSF, in accordance with the United States Internal Revenue Service guidance applicable to qualified sponsorship payments. - - Acknowledgments of appreciation for the Sponsorship Payment may identify and briefly describe Sponsor and its products or product lines in neutral terms and may include Sponsor’s name, logo, well-established slogan, locations, telephone numbers, or website addresses, but such acknowledgments shall not include (a) comparative or qualitative descriptions of Sponsor’s products, services, or facilities; (b) price information or other indications of savings or value associated with Sponsor’s products or services; (c) a call to action; (d) an endorsement; or (e) an inducement to buy, sell, or use Sponsor’s products or services. Any such acknowledgments will be created, or subject to prior review and approval, by the PSF. - - The PSF’s acknowledgment may include the following: - - (a) [**Display of Logo**]{.underline} The PSF will display Sponsor’s logo and other agreed-upon identifying information on www.python.org, and on any marketing and promotional media made by the PSF in connection with the Programs, solely for the purpose of acknowledging Sponsor as a sponsor of the Programs in a manner (placement, form, content, etc.) reasonably determined by the PSF in its sole discretion. Sponsor agrees to provide all the necessary content and materials for use in connection with such display. - - (a) Additional acknowledgment as provided in Sponsor Benefits. - -1. [**Sponsorship Payment**]{.underline} The amount of Sponsorship Payment shall be {{sponsorship.verbose_sponsorship_fee|title}} USD ($ {{sponsorship.sponsorship_fee}}). The Sponsorship Payment is due within thirty (30) days of the Effective Date. To the extent that any portion of a payment under this section would not (if made as a Separate payment) be deemed a qualified sponsorship payment under IRC § 513(i), such portion shall be deemed and treated as separate from the qualified sponsorship payment. - -1. [**Receipt of Payment**]{.underline} Sponsor must submit full payment in order to secure Sponsor Benefits. - -1. [**Refunds**]{.underline} The PSF does not offer refunds for sponsorships. The PSF may cancel the event(s) or any part thereof. In that event, the PSF shall determine and refund to Sponsor the proportionate share of the balance of the aggregate Sponsorship fees applicable to event(s) received which remain after deducting all expenses incurred by the PSF. - -1. [**Sponsor Benefits**]{.underline} Sponsor Benefits per the Agreement are: - - 1. Acknowledgement as described under "Sponsorship" above. - -{%for benefit in benefits%} 1. {{benefit}} -{%endfor%} - -{%if legal_clauses%}1. Legal Clauses. Related legal clauses are: - -{%for clause in legal_clauses%} 1. {{clause}} -{%endfor%}{%endif%} diff --git a/templates/sponsors/admin/preview-contract.html b/templates/sponsors/admin/preview-contract.html new file mode 100644 index 000000000..f89fd02b0 --- /dev/null +++ b/templates/sponsors/admin/preview-contract.html @@ -0,0 +1,283 @@ +{% extends "easy_pdf/base.html" %} +{% load humanize %} + +{% block extra_style %} + +{% endblock %} + +{% block content %} +

        SPONSORSHIP AGREEMENT

        + +

        THIS SPONSORSHIP AGREEMENT (the “Agreement”) is entered into and made +effective as of the {{ start_date|date:"dS" }} day of {{ start_date|date:"F, Y"}} (the “Effective Date”), by and between +Python Software Foundation (the “PSF”), a Delaware nonprofit corporation, and {{ sponsor.name|upper }} (“Sponsor”), a {{ sponsor.state }} corporation. Each of the PSF and Sponsor are +hereinafter sometimes individually referred to as a “Party” and collectively as the “Parties”.

        + +

        RECITALS

        + +

        WHEREAS, the PSF is a tax-exempt charitable organization (EIN 04-3594598) whose +mission is to promote, protect, and advance the Python programming language, and to support +and facilitate the growth of a diverse and international community of Python programmers (the +“Programs”);

        + +

        WHEREAS, Sponsor is {{ contract.sponsor_info}}; and

        + +

        WHEREAS, Sponsor wishes to support the Programs by making a contribution to the +PSF.

        + +

        AGREEMENT

        + +

        NOW, THEREFORE, in consideration of the foregoing and the mutual covenants +contained herein, and for other good and valuable consideration, the receipt and sufficiency of +which are hereby acknowledged, the Parties hereto agree as follows:

        + +
          +
        1. Recitals Incorporated. Each of the above Recitals is incorporated into and is made a part of this Agreement.
        2. + +
        3. Exhibits Incorporated by Reference. All exhibits referenced in this Agreement are incorporated herein as integral parts of this Agreement and shall be considered reiterated herein as fully as if such provisions had been set forth verbatim in this Agreement.
        4. + +
        5. Sponsorship Payment. In consideration for the right to sponsor the PSF and its Programs, and to be acknowledged by the PSF as a sponsor in the manner described herein, Sponsor shall make a contribution to the PSF (the “Sponsorship Payment”) in the amount shown in Exhibit A.
        6. + +
        7. Acknowledgement of Sponsor. In return for the Sponsorship Payment, Sponsor will be entitled to receive the sponsorship package described in Exhibit A attached hereto (the “Sponsor Benefits”).
        8. + +
        9. Intellectual Property. The PSF is the sole owner of all right, title, and interest to all the PSF information, including the PSF’s logo, trademarks, trade names, and copyrighted information, unless otherwise provided.
        10. + +
            +
          1. Grant of License by the PSF. The PSF hereby grants to Sponsor a limited, non-exclusive license to use certain of the PSF’s intellectual property, including the PSF’s name, acronym, and logo (collectively, the “PSF Intellectual Property”), solely in connection with promotion of Sponsor’s sponsorship of the Programs. Sponsor agrees that it shall not use the PSF’s Property in a manner that states or implies that the PSF endorses Sponsor (or Sponsor’s products or services). The PSF retains the right, in its sole and absolute discretion, to review and approve in advance all uses of the PSF Intellectual Property, which approval shall not be unreasonably withheld.
          2. + +
          3. Grant of License by Sponsor. Sponsor hereby grants to the PSF a limited, non-exclusive license to use certain of Sponsor’s intellectual property, including names, trademarks, and copyrights (collectively, “Sponsor Intellectual Property”), solely to identify Sponsor as a sponsor of the Programs and the PSF. Sponsor retains the right to review and approve in advance all uses of the Sponsor Intellectual Property, which approval shall not be unreasonably withheld.
          4. +
          + + +
        11. Term. The Term of this Agreement will begin on {{ start_date|date:"dS, F Y"}} and continue for a period of one (1) year. The Agreement may be renewed for one (1) year by written notice from Sponsor to the PSF.
        12. + +
        13. Termination. The Agreement may be terminated (i) by either Party for any reason upon sixty (60) days prior written notice to the other Party; (ii) if one Party notifies the other Party that the other Party is in material breach of its obligations under this Agreement and such breach (if curable) is not cured with fifteen (15) days of such notice; (iii) if both Parties agree to terminate by mutual written consent; or (iv) if any of Sponsor information is found or is reasonably alleged to violate the rights of a third party. The PSF shall also have the unilateral right to terminate this Agreement at any time if it reasonably determines that it would be detrimental to the reputation and goodwill of the PSF or the Programs to continue to accept or use funds from Sponsor. Upon expiration or termination, no further use may be made by either Party of the other’s name, marks, logo or other intellectual property without the express prior written authorization of the other Party.
        14. + +
        15. Code of Conduct. Sponsor and all of its representatives shall conduct themselves at all times in accordance with the Python Software Foundation Code of Conduct (https://www.python.org/psf/codeofconduct) and/or the PyCon Code of Conduct (https://us.pycon.org/2021/about/code-of-conduct/), as applicable. The PSF reserves the right to eject from any event any Sponsor or representative violating those standards.
        16. + +
        17. Deadlines. Company logos, descriptions, banners, advertising pages, tote bag inserts and similar items and information must be provided by the applicable deadlines for inclusion in the promotional materials for the PSF.
        18. + +
        19. Assignment of Space. If the Sponsor Benefits in Exhibit A include a booth or other display space, the PSF shall assign display space to Sponsor for the period of the display. Location assignments will be on a first-come, first-served basis and will be made solely at the discretion of the PSF. Failure to use a reserved space will result in penalties (up to 50% of your Sponsorship Payment).
        20. + +
        21. Job Postings. Sponsor will ensure that any job postings to be published by the PSF on Sponsor’s behalf comply with all applicable municipal, state, provincial, and federal laws.
        22. + +
        23. Representations and Warranties. Each Party represents and warrants for the benefit of the other Party that it has the legal authority to enter into this Agreement and is able to comply with the terms herein. Sponsor represents and warrants for the benefit of the PSF that it has full right and title to the Sponsor Intellectual Property to be provided under this Agreement and is not under any obligation to any party that restricts the Sponsor Intellectual Property or would prevent Sponsor’s performance under this Agreement.
        24. + +
        25. Successors and Assigns. This Agreement and all the terms and provisions hereof shall be binding upon and inure to the benefit of the Parties and their respective legal representatives, heirs, successors, and/or assigns. The transfer, or any attempted assignment or transfer, of all or any portion of this Agreement by a Party without the prior written consent of the other Party shall be null and void and of no effect.
        26. + +
        27. No Third-Party Beneficiaries. This Agreement is not intended to benefit and shall not be construed to confer upon any person, other than the Parties, any rights, remedies, or other benefits, including but not limited to third-party beneficiary rights.
        28. + +
        29. Severability. If any one or more of the provisions of this Agreement shall be held to be invalid, illegal, or unenforceable, the validity, legality, or enforceability of the remaining provisions of this Agreement shall not be affected thereby. To the extent permitted by applicable law, each Party waives any provision of law which renders any provision of this Agreement invalid, illegal, or unenforceable in any respect.
        30. + +
        31. Confidential Information. As used herein, “Confidential Information” means all confidential information disclosed by a Party (“Disclosing Party”) to the other Party (“Receiving Party”), whether orally or in writing, that is designated as confidential or that reasonably should be understood to be confidential given the nature of the information. Each Party agrees: (a) to observe complete confidentiality with respect to the Confidential Information of the Disclosing Party; (b) not to disclose, or permit any third party or entity access to disclose, the Confidential Information (or any portion thereof) of the Disclosing Party without prior written permission of Disclosing Party; and (c) to ensure that any employees, or any third parties who receive access to the Confidential Information, are advised of the confidential and proprietary nature thereof and are prohibited from disclosing the Confidential Information and using the Confidential Information other than for the benefit of the Receiving Party in accordance with this Agreement. Without limiting the foregoing, each Party shall use the same degree of care that it uses to protect the confidentiality of its own confidential information of like kind, but in no event less than reasonable care. Neither Party shall have any liability with respect to Confidential Information to the extent such information: (w) is or becomes publicly available (other than through a breach of this Agreement); (x) is or becomes available to the Receiving Party on a non-confidential basis, provided that the source of such information was not known by the Receiving Party (after such inquiry as would be reasonable in the circumstances) to be the subject of a confidentiality agreement or other legal or contractual obligation of confidentiality with respect to such information; (y) is developed by the Receiving Party independently and without reference to information provided by the Disclosing Party; or (z) is required to be disclosed by law or court order, provided the Receiving Party gives the Disclosing Party prior notice of such compelled disclosure (to the extent legally permitted) and reasonable assistance, at the Disclosing Party’s cost.
        32. + +
        33. Independent Contractors. Nothing contained herein shall constitute or be construed as the creation of any partnership, agency, or joint venture relationship between the Parties. Neither of the Parties shall have the right to obligate or bind the other Party in any manner whatsoever, and nothing herein contained shall give or is intended to give any rights of any kind to any third party. The relationship of the Parties shall be as independent contractors.
        34. + +
        35. Indemnification. Sponsor agrees to indemnify and hold harmless the PSF, its officers, directors, employees, and agents, for any and all claims, losses, damages, liabilities, judgments, or settlements, including reasonable attorneys’ fees, costs (including costs associated with any official investigations or inquiries) and other expenses, incurred on account of Sponsor’s acts or omissions in connection with the performance of this Agreement or breach of this Agreement or with respect to the manufacture, marketing, sale, or dissemination of any of Sponsor’s products or services. The PSF shall have no liability to Sponsor with respect to its participation in this Agreement or receipt of the Sponsorship Payment, except for intentional or willful acts of the PSF or its employees or agents. The rights and responsibilities established in this section shall survive indefinitely beyond the term of this Agreement.
        36. + +
        37. + Notices. All notices or other communications to be given or delivered under the provisions of this Agreement shall be in writing and shall be mailed by certified or registered mail, return receipt requested, or given or delivered by reputable courier, facsimile, or electronic mail to the Party to receive notice at the following addresses or at such other address as any Party may by notice direct in accordance with this Section: + +
          +
          +

          If to Sponsor:

          +
          +

          {{ sponsor.primary_contact.name }}

          +

          {{ sponsor.name }}

          +

          {{ sponsor.mailing_address_line_1 }}

          + {% if sponsor.mailing_address_line_2 %} +

          {{ sponsor.mailing_address_line_2 }}

          + {% endif %} +

          Facsimile: {{ sponsor.primary_contact.phone }}

          +

          Email: {{ sponsor.primary_contact.email }}

          +
          +

          If to the PSF:

          +
          +

          Ewa Jodlowska

          +

          Executive Director

          +

          Python Software Foundation

          +

          9450 SW Gemini Dr. ECM # 90772

          +

          Beaverton, OR 97008 USA

          +

          Facsimile: +1 (858) 712-8966

          +

          Email: ewa@python.org

          +
          +

          With a copy to:

          +

          Fleming Petenko Law

          +

          1800 John F. Kennedy Blvd

          +

          Suite 904

          +

          Philadelphia, PA 19103 USA

          +

          Facsimile: (267) 422-9864

          +

          Email: info@nonprofitlawllc.com

          +
          +
          +

          Notices given by registered or certified mail shall be deemed as given on the delivery date shown on the return receipt, and notices given in any other manner shall be deemed as given when received.

          +
        38. + +
        39. Governing Law; Jurisdiction. This Agreement shall be construed in accordance with the laws of the State of Delaware, without regard to its conflicts of law principles. Jurisdiction and venue for litigation of any dispute, controversy, or claim arising out of or in connection with this Agreement shall be only in a United States federal court in Delaware or a Delaware state court having subject matter jurisdiction. Each of the Parties hereto hereby expressly submits to the personal jurisdiction of the foregoing courts located in Delaware and hereby waives any objection or defense based on personal jurisdiction or venue that might otherwise be asserted to proceedings in such courts.
        40. + +
        41. Force Majeure. The PSF shall not be liable for any failure or delay in performing its obligations hereunder if such failure or delay is due in whole or in part to any cause beyond its reasonable control or the reasonable control of its contractors, agents, or suppliers, including, but not limited to, strikes, or other labor disturbances, acts of God, acts of war or terror, floods, sabotage, fire, natural, or other disasters, including pandemics. To the extent the PSF is unable to substantially perform hereunder due to any cause beyond its control as contemplated herein, it may terminate this Agreement as it may decide in its sole discretion. To the extent the PSF so terminates the Agreement, Sponsor releases the PSF and waives any claims for damages or compensation on account of such termination.
        42. + +
        43. No Waiver. A waiver of any breach of any provision of this Agreement shall not be deemed a waiver of any repetition of such breach or in any manner affect any other terms of this Agreement.
        44. + +
        45. Limitation of Damages. Except as otherwise provided herein, neither Party shall be liable to the other for any consequential, incidental, or punitive damages for any claims arising directly or indirectly out of this Agreement.
        46. + +
        47. Cumulative Remedies. All rights and remedies provided in this Agreement are cumulative and not exclusive, and the exercise by either Party of any right or remedy does not preclude the exercise of any other rights or remedies that may now or subsequently be available at law, in equity, by statute, in any other agreement between the Parties, or otherwise.
        48. + +
        49. Captions. The captions and headings are included herein for convenience and do not constitute a part of this Agreement.
        50. + +
        51. Amendments. No addition to or change in the terms of this Agreement will be binding on any Party unless set forth in writing and executed by both Parties.
        52. + +
        53. Counterparts. This Agreement may be executed in one or more counterparts, each of which shall be deemed an original and all of which shall be taken together and deemed to be one instrument. A signed copy of this Agreement delivered by facsimile, electronic mail, or other means of electronic transmission shall be deemed to have the same legal effect as delivery of an original signed copy of this Agreement.
        54. + +
        55. Entire Agreement. This Agreement (including the Exhibits) sets forth the entire agreement of the Parties and supersedes all prior oral or written agreements or understandings between the Parties as to the subject matter of this Agreement. Except as otherwise expressly provided herein, neither Party is relying upon any warranties, representations, assurances, or inducements of the other Party.
        56. +
        + +

        [Signature Page Follows]

        +
        + +

        SPONSORSHIP AGREEMENT

        + + +

        IN WITNESS WHEREOF, the Parties hereto have duly executed this __________________ Agreement as of the Effective Date.

        + +
        +

        PSF:

        +

        PYTHON SOFTWARE FOUNDATION,

        +

        a Delaware nonprofit corporation

        + +
        +
        + +

        By: + ___________________________________

        +
        +

        Ewa Jodlowska

        +

        Executive Director

        +
        + +
        +
        + +

        SPONSOR:

        +

        ______________________________________,

        +

        a {{ sponsor.state }} entity.

        +
        +

        By: ___________________________________

        + +
        +
        + +

        SPONSORSHIP AGREEMENT

        + +

        EXHIBIT A

        + +
          +
        1. Sponsorship. During the Term of this Agreement, in return for the Sponsorship Payment, the PSF agrees to identify and acknowledge Sponsor as a {{ start_date|date:'Y' }} {{ sponsorship.level_name }} Sponsor of the Programs and of the PSF, in accordance with the United States Internal Revenue Service guidance applicable to qualified sponsorship payments.
        2. + +

          Acknowledgments of appreciation for the Sponsorship Payment may identify and briefly describe Sponsor and its products or product lines in neutral terms and may include Sponsor’s name, logo, well-established slogan, locations, telephone numbers, or website addresses, but such acknowledgments shall not include (a) comparative or qualitative descriptions of Sponsor’s products, services, or facilities; (b) price information or other indications of savings or value associated with Sponsor’s products or services; (c) a call to action; (d) an endorsement; or (e) an inducement to buy, sell, or use Sponsor’s products or services. Any such acknowledgments will be created, or subject to prior review and approval, by the PSF.

          + +

          The PSF’s acknowledgment may include the following:

          + +
            +
          1. Display of Logo. The PSF will display Sponsor’s logo and other agreed-upon identifying information on www.python.org, and on any marketing and promotional media made by the PSF in connection with the Programs, solely for the purpose of acknowledging Sponsor as a sponsor of the Programs in a manner (placement, form, content, etc.) reasonably determined by the PSF in its sole discretion. Sponsor agrees to provide all the necessary content and materials for use in connection with such display.
          2. + +
          3. [Other use or Acknowledgement.]
          4. +
          + +
        3. Sponsorship Payment. The amount of Sponsorship Payment shall be {{ sponsorship.verbose_sponsorship_fee|title }} USD ($ {{ sponsorship.sponsorship_fee|intcomma }}). The Sponsorship Payment is due within thirty (30) days of the Effective Date. To the extent that any portion of a payment under this section would not (if made as a Separate payment) be deemed a qualified sponsorship payment under IRC § 513(i), such portion shall be deemed and treated as separate from the qualified sponsorship payment.
        4. + +
        5. Receipt of Payment. Sponsor must submit full payment in order to secure Sponsor Benefits.
        6. + +
        7. Refunds. The PSF does not offer refunds for sponsorships. The PSF may cancel the event(s) or any part thereof. In that event, the PSF shall determine and refund to Sponsor the proportionate share of the balance of the aggregate Sponsorship fees applicable to event(s) received which remain after deducting all expenses incurred by the PSF.
        8. + +
        9. Sponsor Benefits. Sponsor Benefits per the Agreement are:
        10. + +
            +
          1. Acknowledgement as described under “Sponsorship” above.
          2. + {% for benefit in benefits %} +
          3. {{ benefit }}
          4. + {% endfor %} +
          + + + {% if legal_clauses %} +
        11. Legal Clauses. Related legal clauses are:
        12. +
            + {% for clause in legal_clauses %} +
          1. {{ clause }}
          2. + {% endfor %} +
          + {% endif %} +
        + +{% endblock %} diff --git a/templates/sponsors/admin/renewal-contract-template.docx b/templates/sponsors/admin/renewal-contract-template.docx new file mode 100644 index 0000000000000000000000000000000000000000..3e36801a316f85a4a0484c7b4ed1a227a9fb4285 GIT binary patch literal 9323 zcma)C1yozxwhiuu;_hDD-QC@3X>kg{f;$us?iBY@+@-j?OM&99#hre*|Gj^E@Bi

        E*dJc2N$B6)ouG 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 uz+Wd(o%mnyza-?p3o*ymGZjwy)a`s>Q`g|M! literal 0 HcmV?d00001 diff --git a/texlive.packages b/texlive.packages deleted file mode 100644 index fc8668ea0..000000000 --- a/texlive.packages +++ /dev/null @@ -1,2 +0,0 @@ -xcolor -etoolbox From a7f830a4ffd02988c99a9ef80773c1c9c91b6800 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Langa?= Date: Wed, 21 Feb 2024 15:52:07 +0100 Subject: [PATCH 069/112] Remove stranded from templates/base.html (#2377) This was introduced in #2367. --- templates/base.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/base.html b/templates/base.html index cfa0f34ce..424df06f6 100644 --- a/templates/base.html +++ b/templates/base.html @@ -236,7 +236,7 @@

      • Socialize