From 5eb3dff30e255de23a6fcc65da5c22e8695f7c0e Mon Sep 17 00:00:00 2001 From: Ester Beltrami Date: Sat, 30 Aug 2025 14:49:27 +0300 Subject: [PATCH 1/4] Rename `PyConIt` sponsor data file to `PyConItalia` Renamed the sponsor data file from `data/sponsors/PyConIt/2024.json` to `data/sponsors/PyConItalia/2024.json` to use the correct conference name, `PyCon Italia`. --- data/sponsors/PyConItalia/2024.json | 134 ++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 data/sponsors/PyConItalia/2024.json diff --git a/data/sponsors/PyConItalia/2024.json b/data/sponsors/PyConItalia/2024.json new file mode 100644 index 0000000..b89629b --- /dev/null +++ b/data/sponsors/PyConItalia/2024.json @@ -0,0 +1,134 @@ +{ + "year":2024, + "levels": { + "Keystone": 10000, + "Gold": 7000, + "Silver": 5000, + "Bronze": 3000, + "Patron": 1000, + "Startup": 500, + "Diversity": 1000, + "Exclusive Tech Partner": "Unknown" + }, + "sponsors": [ + { + "name": "Kraken", + "website": "https://kraken.tech/", + "level": "Keystone" + }, + { + "name": "Vedrai", + "website": "https://www.vedrai.com/en", + "level": "Gold" + }, + { + "name": "Pydantic", + "website": "https://pydantic.dev/", + "level": "Gold", + { + "name": "20tabs", + "website": "https://www.20tab.com/", + "level": "Silver" + }, + { + "name": "Fiscozen", + "website": "https://www.fiscozen.it/", + "level": "Silver" + }, + { + "name": "Go Generali", + "website": "https://gogenerali.com/home", + "level": "Silver" + }, + { + "name": "Sentry", + "website": "https://sentry.io/welcome/", + "level": "Exclusive Tech Partner" + }, + { + "name": "Bloomberg", + "website": "https://www.bloomberg.com/company/", + "level": "Bronze" + }, + { + "name": "Labs immobiliare", + "website": "https://labs.immobiliare.it/", + "level": "Bronze" + }, + { + "name": "Jet Brains", + "website": "https://www.jetbrains.com/", + "level": "Bronze" + }, + { + "name": "Trux code", + "website": "https://thux.it/it/thux-code/", + "level": "Patron" + }, + { + "name": "Appbox.cloud", + "website": "https://appbox.cloud/", + "level": "Patron" + }, + { + "name": "Division lab", + "website": "https://dvisionlab.it/", + "level": "Patron" + }, + { + "name": "App Signal", + "website": "https://www.appsignal.com/", + "level": "Patron" + }, + { + "name": "Dygma", + "website": "https://dygma.com/", + "level": "Patron" + }, + { + "name": "Subito", + "website": "https://www.subito.it/", + "level": "Patron" + }, + { + "name": "Fabio Lammana", + "website": "https://www.fabiolamanna.it/", + "level": "Startup" + }, + { + "name": "ELAN42", + "website": "https://www.elan42.com/", + "level": "Startup" + }, + { + "name": "Barisoft", + "website": "https://www.barisoft.it/", + "level": "Startup" + }, + { + "name": "Smitten", + "website": "https://smitten.fun/", + "level": "Startup" + }, + { + "name": "EuroPython Society (EPS)", + "website": "https://www.europython-society.org/", + "level": "Diversity" + }, + { + "name": "nephila", + "website": "https://www.python.org/psf-landing/", + "level": "Diversity" + }, + { + "name": "seeweb", + "website": "https://www.seeweb.it/", + "level": "Diversity" + }, + { + "name": "Python Software Foundation (PSF)", + "website": "https://www.python.org/psf-landing/", + "level": "Diversity" + } + ] +} From 9fb2e6dc2c7520b65fee9eb062c9c20a9c5dca34 Mon Sep 17 00:00:00 2001 From: Ester Beltrami Date: Sat, 30 Aug 2025 14:54:05 +0300 Subject: [PATCH 2/4] Add script to fetch sponsors data from PyCon Italia GraphQL API Introduce `scripts/pyconitalia.py` to fetch and save sponsors data from the PyCon Italia GraphQL API. The script retrieves sponsor levels and sponsor details, formats them, and writes the result to a JSON file. This will help automate the process of collecting and storing sponsor information for each conference year. --- scripts/pyconitalia.py | 183 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 scripts/pyconitalia.py diff --git a/scripts/pyconitalia.py b/scripts/pyconitalia.py new file mode 100644 index 0000000..73d2180 --- /dev/null +++ b/scripts/pyconitalia.py @@ -0,0 +1,183 @@ +import json +import sys +import argparse +from pathlib import Path +from typing import Any, TypedDict + +import requests +import logging + +logger = logging.getLogger(__name__) + + +class GraphQLPayload(TypedDict): + query: str + variables: dict[str, str] + + +class GraphQLResponse(TypedDict): + data: dict[str, dict[str, Any]] + errors: list[dict[str, Any]] | None + + +def fetch_graphql_data(query: str, variables: dict[str, str]) -> GraphQLResponse: + """ + Fetch data from the PyCon Italia GraphQL endpoint. + """ + headers = { + "Content-Type": "application/json", + } + + payload: GraphQLPayload = { + "query": query, + "variables": variables, + } + + try: + response = requests.post( + "https://pycon.it/graphql", json=payload, headers=headers + ) + response.raise_for_status() + return response.json() + except requests.exceptions.RequestException: + logger.exception("Error fetching data:") + sys.exit(1) + + +def get_pycon_sponsors(conference_code: str) -> GraphQLResponse: + """ + Fetch sponsors data from PyCon Italia GraphQL API. + """ + + query = """ + query GetSponsors($code: String!) { + conference(code: $code) { + sponsorsByLevel { + level + sponsors { + name + link + } + } + sponsorLevels { + name + price + } + start + } + } + """ + + variables = {"code": conference_code} + + return fetch_graphql_data(query, variables) + + +class Sponsor(TypedDict): + name: str + website: str + level: str + + +class SponsorsData(TypedDict): + year: int + levels: dict[str, int] + sponsors: list[Sponsor] + + +def format_sponsors_data(raw_data: GraphQLResponse) -> SponsorsData: + """ + Format the raw GraphQL response into a structured format. + """ + if "errors" in raw_data and raw_data["errors"]: + raise ValueError(f"GraphQL errors: {raw_data['errors']}") + + conference_data = raw_data["data"]["conference"] + sponsors_by_level = conference_data["sponsorsByLevel"] + sponsor_levels = conference_data["sponsorLevels"] + start_date = conference_data["start"] + + # Extract year from start date + year = int(start_date.split("-")[0]) + + # Create levels dictionary + levels_dict: dict[str, int] = {} + for level_data in sponsor_levels: + name = level_data["name"] + price_str = level_data["price"] + # Convert price string to integer (e.g., "15000.00" -> 15000) + try: + price = int(float(price_str)) + except (ValueError, TypeError): + price = 0 # fallback for invalid prices + levels_dict[name] = price + + # Create sponsors list in the format you specified + sponsors_list: list[Sponsor] = [] + for level_data in sponsors_by_level: + level = level_data["level"] + sponsors = level_data["sponsors"] + + for sponsor in sponsors: + sponsors_list.append( + {"name": sponsor["name"], "website": sponsor["link"], "level": level} + ) + + return {"year": year, "levels": levels_dict, "sponsors": sponsors_list} + + +def save_to_json(data: SponsorsData, output_file: Path) -> None: + """ + Save data to a JSON file. + """ + try: + with open(output_file, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=4) + logger.info("Data saved to: %s", output_file) + except IOError as e: + logger.error("Error saving file: %s", e) + sys.exit(1) + + +def main(): + parser = argparse.ArgumentParser( + description="Fetch sponsors data from PyCon Italia GraphQL API" + ) + parser.add_argument( + "--conference-code", required=True, help="Conference code (e.g., pycon12)" + ) + parser.add_argument( + "--output", + type=Path, + help=( + "Output JSON file path (optional, defaults to " + "data/sponsors/PyConIt/{year}.json)" + ), + ) + + args = parser.parse_args() + + logger.info("Fetching sponsors data for conference: %s", args.conference_code) + + # Fetch raw data from GraphQL API + raw_data = get_pycon_sponsors(args.conference_code) + + if not raw_data: + logger.error("No data received from the API") + sys.exit(1) + + # Format the data + formatted_data = format_sponsors_data(raw_data) + + # Output or save data + output_path = ( + args.output + if args.output + else (Path("data/sponsors/PyConItalia") / f"{formatted_data['year']}.json") + ) + output_path.parent.mkdir(parents=True, exist_ok=True) + save_to_json(formatted_data, output_path) + + +if __name__ == "__main__": + main() From ae2490ec87561ab0efdc14522233753de6869d59 Mon Sep 17 00:00:00 2001 From: Ester Beltrami Date: Sat, 30 Aug 2025 15:13:19 +0300 Subject: [PATCH 3/4] Add PyCon Italia sponsors data for 2022, 2023, 2024, and 2025 Add new JSON files for PyCon Italia sponsors for years 2022, 2023, and 2025, and update the 2024 data in `data/sponsors/PyConItalia/{2022,2023,2024,2025}.json`. This ensures that sponsor and level information is available for these years and keeps the dataset up to date for the conference series. - Adds new files: `2022.json`, `2023.json`, `2025.json` - Updates: `2024.json` with latest sponsor and level data This data will be used for sponsor listings and historical reference across the PyCon Italia website and related tools. --- data/sponsors/PyConItalia/2022.json | 155 ++++++++++++++ data/sponsors/PyConItalia/2023.json | 254 ++++++++++++++++++++++ data/sponsors/PyConItalia/2024.json | 187 ++++++++++++++--- data/sponsors/PyConItalia/2025.json | 315 ++++++++++++++++++++++++++++ 4 files changed, 881 insertions(+), 30 deletions(-) create mode 100644 data/sponsors/PyConItalia/2022.json create mode 100644 data/sponsors/PyConItalia/2023.json create mode 100644 data/sponsors/PyConItalia/2025.json diff --git a/data/sponsors/PyConItalia/2022.json b/data/sponsors/PyConItalia/2022.json new file mode 100644 index 0000000..5825d04 --- /dev/null +++ b/data/sponsors/PyConItalia/2022.json @@ -0,0 +1,155 @@ +{ + "year": 2022, + "levels": { + "Keystone": 0, + "Gold": 0, + "Silver": 0, + "Bronze": 0, + "Patron": 0, + "Diversity": 0, + "Startup": 0, + "Partners": 0 + }, + "sponsors": [ + { + "name": "Symphonie Prime", + "website": "https://symphonieprime.com/", + "level": "Keystone" + }, + { + "name": "Telnyx", + "website": "https://telnyx.com/", + "level": "Gold" + }, + { + "name": "Prima", + "website": "http://www.helloprima.com", + "level": "Gold" + }, + { + "name": "Casavo", + "website": "https://casavo.com/it/", + "level": "Silver" + }, + { + "name": "Jina", + "website": "https://github.com/jina-ai/jina", + "level": "Silver" + }, + { + "name": "Octopus Energy", + "website": "https://octopusenergy.it/", + "level": "Silver" + }, + { + "name": "BCG", + "website": "https://www.bcg.com/it-it", + "level": "Bronze" + }, + { + "name": "20tab", + "website": "https://www.20tab.com/", + "level": "Patron" + }, + { + "name": "Maieutical Labs", + "website": "https://maieuticallabs.it/", + "level": "Patron" + }, + { + "name": "Djungle", + "website": "https://djungle.io/", + "level": "Patron" + }, + { + "name": "EuroPython Society", + "website": "https://www.europython-society.org/", + "level": "Diversity" + }, + { + "name": "Nephila", + "website": "https://www.nephila.digital/it/", + "level": "Diversity" + }, + { + "name": "Python Software Foundation", + "website": "https://www.python.org/psf/", + "level": "Diversity" + }, + { + "name": "ClearBox AI", + "website": "https://clearbox.ai/", + "level": "Startup" + }, + { + "name": "Fabio Lamanna", + "website": "http://www.fabiolamanna.it/", + "level": "Startup" + }, + { + "name": "Vedrai", + "website": "https://vedrai.com/", + "level": "Startup" + }, + { + "name": "iGenius", + "website": "https://igenius.ai/", + "level": "Startup" + }, + { + "name": "Roll Studio", + "website": "https://rollstudio.co.uk", + "level": "Partners" + }, + { + "name": "Top-IX", + "website": "https://www.top-ix.org/it/home/", + "level": "Partners" + }, + { + "name": "Python Biella Group", + "website": "https://pythonbiellagroup.it/", + "level": "Partners" + }, + { + "name": "DataMasters", + "website": "https://datamasters.it/", + "level": "Partners" + }, + { + "name": "GrUSP", + "website": "https://www.grusp.org/", + "level": "Partners" + }, + { + "name": "PyRE", + "website": "https://pyre.it", + "level": "Partners" + }, + { + "name": "In Sprint Srl", + "website": "https://www.in-sprint.com/", + "level": "Partners" + }, + { + "name": "Speck&Tech", + "website": "https://speckand.tech/", + "level": "Partners" + }, + { + "name": "Packt", + "website": "https://packt.link/pyconitalia2025", + "level": "Partners" + }, + { + "name": "Fresh Lemonade Gardens", + "website": "https://www.freshlemonadegardens.com/", + "level": "Partners" + }, + { + "name": "Python Milano", + "website": "http://milano.python.it", + "level": "Partners" + } + ] +} \ No newline at end of file diff --git a/data/sponsors/PyConItalia/2023.json b/data/sponsors/PyConItalia/2023.json new file mode 100644 index 0000000..b2ac365 --- /dev/null +++ b/data/sponsors/PyConItalia/2023.json @@ -0,0 +1,254 @@ +{ + "year": 2023, + "levels": { + "Gold": 0, + "Silver": 0, + "Bronze": 0, + "Patron": 0, + "Startup": 0, + "Diversity": 0, + "Partner": 0 + }, + "sponsors": [ + { + "name": "Sentry", + "website": "https://sentry.io/welcome/", + "level": "Gold" + }, + { + "name": "Thux Code", + "website": "https://thux.it/it/thux-code/", + "level": "Silver" + }, + { + "name": "Octopus Energy", + "website": "https://octopusenergy.it/", + "level": "Silver" + }, + { + "name": "84codes", + "website": "http://www.cloudamqp.com", + "level": "Silver" + }, + { + "name": "Fiscozen", + "website": "https://www.fiscozen.it/", + "level": "Silver" + }, + { + "name": "Deepset", + "website": "https://www.deepset.ai/", + "level": "Bronze" + }, + { + "name": "Orobix", + "website": "https://orobix.com/", + "level": "Bronze" + }, + { + "name": "bit4id", + "website": "http://www.bit4id.com/", + "level": "Bronze" + }, + { + "name": "Hype", + "website": "https://www.hype.it", + "level": "Bronze" + }, + { + "name": "20tab", + "website": "https://www.20tab.com/", + "level": "Patron" + }, + { + "name": "Paneido", + "website": "https://www.paneido.com/", + "level": "Patron" + }, + { + "name": "Quix", + "website": "https://quix.io/", + "level": "Patron" + }, + { + "name": "Witapp", + "website": "https://www.witapp.it/", + "level": "Patron" + }, + { + "name": "BIP Group", + "website": "https://www.bipxtech.com/en/home/", + "level": "Patron" + }, + { + "name": "Fabio Lamanna", + "website": "http://www.fabiolamanna.it/", + "level": "Startup" + }, + { + "name": "E42", + "website": "https://www.elan42.com/", + "level": "Startup" + }, + { + "name": "EuroPython Society", + "website": "https://www.europython-society.org/", + "level": "Diversity" + }, + { + "name": "Nephila", + "website": "https://www.nephila.digital/it/", + "level": "Diversity" + }, + { + "name": "Python Software Foundation", + "website": "https://www.python.org/psf/", + "level": "Diversity" + }, + { + "name": "Develer", + "website": "https://www.develer.com", + "level": "Partner" + }, + { + "name": "Top-IX", + "website": "https://www.top-ix.org/it/home/", + "level": "Partner" + }, + { + "name": "Manning", + "website": "https://www.manning.com/", + "level": "Partner" + }, + { + "name": "Python Biella Group", + "website": "https://pythonbiellagroup.it/", + "level": "Partner" + }, + { + "name": "DataMasters", + "website": "https://datamasters.it/", + "level": "Partner" + }, + { + "name": "GrUSP", + "website": "https://www.grusp.org/", + "level": "Partner" + }, + { + "name": "Speck&Tech", + "website": "https://speckand.tech/", + "level": "Partner" + }, + { + "name": "Python Milano", + "website": "http://milano.python.it", + "level": "Partner" + }, + { + "name": "theRedCode", + "website": "https://www.theredcode.it/", + "level": "Partner" + }, + { + "name": "Schrödinger Hat", + "website": "https://www.schrodinger-hat.it/", + "level": "Partner" + }, + { + "name": "Come to Code", + "website": "https://www.cometocode.it/", + "level": "Partner" + }, + { + "name": "GDG Pisa", + "website": "https://gdgpisa.it/", + "level": "Partner" + }, + { + "name": "WTM Pisa", + "website": "https://gdgpisa.it/wtm", + "level": "Partner" + }, + { + "name": "PointerPodcast", + "website": "https://pointerpodcast.it/", + "level": "Partner" + }, + { + "name": "firenze.dev", + "website": "https://firenze.dev/community", + "level": "Partner" + }, + { + "name": "Mozilla Italia", + "website": "https://www.mozillaitalia.org/", + "level": "Partner" + }, + { + "name": "EA Data Science/ML/AI", + "website": "https://forum.effectivealtruism.org/groups/zhBeNLrGug2EvhnfS", + "level": "Partner" + }, + { + "name": "ENGIM Torino", + "website": "http://www.engimtorino.net/", + "level": "Partner" + }, + { + "name": "She Tech", + "website": "https://shetechitaly.org/eventi/", + "level": "Partner" + }, + { + "name": "WTM Italia", + "website": "https://www.facebook.com/WTMItalia", + "level": "Partner" + }, + { + "name": "Codemotion", + "website": "http://codemo.tech/partners", + "level": "Partner" + }, + { + "name": "pisa.dev", + "website": "https://pisa.dev/", + "level": "Partner" + }, + { + "name": "Women In Voice Italy", + "website": "https://womeninvoice.org/wiv-italy/", + "level": "Partner" + }, + { + "name": "Django Girls Italia", + "website": "https://djangogirls.org/pt/bologna/", + "level": "Partner" + }, + { + "name": "NumFocus", + "website": "https://numfocus.org/", + "level": "Partner" + }, + { + "name": "Apogeo Editore", + "website": "https://www.apogeonline.com/", + "level": "Partner" + }, + { + "name": "Product Management Day", + "website": "https://www.productmanagementday.com/", + "level": "Partner" + }, + { + "name": "XstreamData Lab", + "website": "https://www.meetup.com/it-IT/xstream-data/", + "level": "Partner" + }, + { + "name": "42 Firenze", + "website": "https://42firenze.it/", + "level": "Partner" + } + ] +} \ No newline at end of file diff --git a/data/sponsors/PyConItalia/2024.json b/data/sponsors/PyConItalia/2024.json index b89629b..8cc0923 100644 --- a/data/sponsors/PyConItalia/2024.json +++ b/data/sponsors/PyConItalia/2024.json @@ -1,14 +1,15 @@ { - "year":2024, + "year": 2024, "levels": { "Keystone": 10000, "Gold": 7000, "Silver": 5000, + "Exclusive Tech Partner": 6000, "Bronze": 3000, "Patron": 1000, "Startup": 500, "Diversity": 1000, - "Exclusive Tech Partner": "Unknown" + "Media Partners": 0 }, "sponsors": [ { @@ -18,26 +19,27 @@ }, { "name": "Vedrai", - "website": "https://www.vedrai.com/en", + "website": "https://vedrai.com/", "level": "Gold" }, { - "name": "Pydantic", - "website": "https://pydantic.dev/", - "level": "Gold", + "name": "Pydantic", + "website": "https://pydantic.dev/", + "level": "Gold" + }, { - "name": "20tabs", + "name": "20tab", "website": "https://www.20tab.com/", "level": "Silver" }, - { - "name": "Fiscozen", - "website": "https://www.fiscozen.it/", + { + "name": "Fiscozen", + "website": "https://www.fiscozen.it/", "level": "Silver" }, { - "name": "Go Generali", - "website": "https://gogenerali.com/home", + "name": "Generali", + "website": "http://www.gogenerali.com", "level": "Silver" }, { @@ -51,32 +53,32 @@ "level": "Bronze" }, { - "name": "Labs immobiliare", + "name": "Immobiliare.it", "website": "https://labs.immobiliare.it/", "level": "Bronze" }, { - "name": "Jet Brains", + "name": "JetBrains", "website": "https://www.jetbrains.com/", "level": "Bronze" }, { - "name": "Trux code", + "name": "Thux Code", "website": "https://thux.it/it/thux-code/", "level": "Patron" }, { - "name": "Appbox.cloud", + "name": "APPBOX", "website": "https://appbox.cloud/", "level": "Patron" }, { - "name": "Division lab", + "name": "Dvision Lab", "website": "https://dvisionlab.it/", "level": "Patron" }, { - "name": "App Signal", + "name": "AppSignal", "website": "https://www.appsignal.com/", "level": "Patron" }, @@ -86,17 +88,17 @@ "level": "Patron" }, { - "name": "Subito", - "website": "https://www.subito.it/", + "name": "subito.it", + "website": "https://www.subito.it", "level": "Patron" }, { - "name": "Fabio Lammana", - "website": "https://www.fabiolamanna.it/", + "name": "Fabio Lamanna", + "website": "http://www.fabiolamanna.it/", "level": "Startup" }, { - "name": "ELAN42", + "name": "E42", "website": "https://www.elan42.com/", "level": "Startup" }, @@ -111,24 +113,149 @@ "level": "Startup" }, { - "name": "EuroPython Society (EPS)", + "name": "EuroPython Society", "website": "https://www.europython-society.org/", "level": "Diversity" }, { - "name": "nephila", - "website": "https://www.python.org/psf-landing/", + "name": "Nephila", + "website": "https://www.nephila.digital/it/", "level": "Diversity" }, { - "name": "seeweb", - "website": "https://www.seeweb.it/", + "name": "Python Software Foundation", + "website": "https://www.python.org/psf/", "level": "Diversity" }, { - "name": "Python Software Foundation (PSF)", - "website": "https://www.python.org/psf-landing/", + "name": "Seeweb", + "website": "https://www.seeweb.it", "level": "Diversity" + }, + { + "name": "Top-IX", + "website": "https://www.top-ix.org/it/home/", + "level": "Media Partners" + }, + { + "name": "Python Biella Group", + "website": "https://pythonbiellagroup.it/", + "level": "Media Partners" + }, + { + "name": "GrUSP", + "website": "https://www.grusp.org/", + "level": "Media Partners" + }, + { + "name": "PyRE", + "website": "https://pyre.it", + "level": "Media Partners" + }, + { + "name": "Speck&Tech", + "website": "https://speckand.tech/", + "level": "Media Partners" + }, + { + "name": "Python Milano", + "website": "http://milano.python.it", + "level": "Media Partners" + }, + { + "name": "theRedCode", + "website": "https://www.theredcode.it/", + "level": "Media Partners" + }, + { + "name": "Schrödinger Hat", + "website": "https://www.schrodinger-hat.it/", + "level": "Media Partners" + }, + { + "name": "GDG Pisa", + "website": "https://gdgpisa.it/", + "level": "Media Partners" + }, + { + "name": "WTM Pisa", + "website": "https://gdgpisa.it/wtm", + "level": "Media Partners" + }, + { + "name": "firenze.dev", + "website": "https://firenze.dev/community", + "level": "Media Partners" + }, + { + "name": "She Tech", + "website": "https://shetechitaly.org/eventi/", + "level": "Media Partners" + }, + { + "name": "WTM Italia", + "website": "https://www.facebook.com/WTMItalia", + "level": "Media Partners" + }, + { + "name": "Codemotion", + "website": "http://codemo.tech/partners", + "level": "Media Partners" + }, + { + "name": "pisa.dev", + "website": "https://pisa.dev/", + "level": "Media Partners" + }, + { + "name": "Django Girls Italia", + "website": "https://djangogirls.org/pt/bologna/", + "level": "Media Partners" + }, + { + "name": "Apogeo Editore", + "website": "https://www.apogeonline.com/", + "level": "Media Partners" + }, + { + "name": "PyCon Lithuania", + "website": "https://pycon.lt/2024", + "level": "Media Partners" + }, + { + "name": "DjangoCon EU", + "website": "https://2024.djangocon.eu/", + "level": "Media Partners" + }, + { + "name": "PLUG", + "website": "https://www.pignolalug.it/", + "level": "Media Partners" + }, + { + "name": "PyBari", + "website": "https://bari.python.it/", + "level": "Media Partners" + }, + { + "name": "Python Pescara", + "website": "https://pescara.python.it/", + "level": "Media Partners" + }, + { + "name": "PyRoma", + "website": "https://t.me/pyroma", + "level": "Media Partners" + }, + { + "name": "Python Torino", + "website": "https://torino.python.it/", + "level": "Media Partners" + }, + { + "name": "Tripsitta", + "website": "https://tripsitta.com/", + "level": "Media Partners" } ] } diff --git a/data/sponsors/PyConItalia/2025.json b/data/sponsors/PyConItalia/2025.json new file mode 100644 index 0000000..d90e7f7 --- /dev/null +++ b/data/sponsors/PyConItalia/2025.json @@ -0,0 +1,315 @@ +{ + "year": 2025, + "levels": { + "Keystone": 15000, + "Gold": 10000, + "Silver": 7300, + "Bronze": 3000, + "Patron": 1500, + "Startup": 600, + "Kinship": 1000, + "Media Partners": 0 + }, + "sponsors": [ + { + "name": "Prima", + "website": "http://www.helloprima.com", + "level": "Keystone" + }, + { + "name": "Qube RT", + "website": "https://www.qube-rt.com/", + "level": "Gold" + }, + { + "name": "NTT DATA", + "website": "https://it.nttdata.com/", + "level": "Gold" + }, + { + "name": "Zanichelli DATA Office", + "website": "https://github.com/ZanichelliEditore/data_office", + "level": "Gold" + }, + { + "name": "Kraken", + "website": "https://kraken.tech/", + "level": "Silver" + }, + { + "name": "Generali", + "website": "http://www.gogenerali.com", + "level": "Silver" + }, + { + "name": "VARgroup", + "website": "https://www.vargroup.com/", + "level": "Silver" + }, + { + "name": "Apify", + "website": "https://apify.com/", + "level": "Silver" + }, + { + "name": "FastAPI", + "website": "https://fastapicloud.com/", + "level": "Silver" + }, + { + "name": "Nephila", + "website": "https://www.nephila.digital/it/", + "level": "Bronze" + }, + { + "name": "Fiscozen", + "website": "https://www.fiscozen.it/", + "level": "Bronze" + }, + { + "name": "Bloomberg", + "website": "https://www.bloomberg.com/company/", + "level": "Bronze" + }, + { + "name": "AppSignal", + "website": "https://www.appsignal.com/", + "level": "Bronze" + }, + { + "name": "Crif", + "website": "https://www.crif.com/", + "level": "Bronze" + }, + { + "name": "Tenaris", + "website": "https://www.tenaris.com/en", + "level": "Bronze" + }, + { + "name": "20tab", + "website": "https://www.20tab.com/", + "level": "Patron" + }, + { + "name": "Thux Code", + "website": "https://thux.it/it/thux-code/", + "level": "Patron" + }, + { + "name": "Barisoft", + "website": "https://www.barisoft.it/", + "level": "Patron" + }, + { + "name": "Zattoo", + "website": "https://zattoo.com/int", + "level": "Patron" + }, + { + "name": "devpunks", + "website": "https://www.devpunks.com/", + "level": "Patron" + }, + { + "name": "Fondazione CNI", + "website": "https://mying.it/", + "level": "Patron" + }, + { + "name": "BPER", + "website": "https://www.bper.it/", + "level": "Patron" + }, + { + "name": "Fabio Lamanna", + "website": "http://www.fabiolamanna.it/", + "level": "Startup" + }, + { + "name": "Cargoful", + "website": "https://cargoful.tech/", + "level": "Startup" + }, + { + "name": "ML Cube", + "website": "http://mlcube.com", + "level": "Startup" + }, + { + "name": "EuroPython Society", + "website": "https://www.europython-society.org/", + "level": "Kinship" + }, + { + "name": "Python Software Foundation", + "website": "https://www.python.org/psf/", + "level": "Kinship" + }, + { + "name": "Packt", + "website": "https://packt.link/pyconitalia2025", + "level": "Kinship" + }, + { + "name": "Django Software Foundation", + "website": "https://www.djangoproject.com/", + "level": "Kinship" + }, + { + "name": "Regione Emilia Romagna", + "website": "https://emiliaromagnaturismo.it/it", + "level": "Kinship" + }, + { + "name": "Top-IX", + "website": "https://www.top-ix.org/it/home/", + "level": "Media Partners" + }, + { + "name": "Python Biella Group", + "website": "https://pythonbiellagroup.it/", + "level": "Media Partners" + }, + { + "name": "DataMasters", + "website": "https://datamasters.it/", + "level": "Media Partners" + }, + { + "name": "GrUSP", + "website": "https://www.grusp.org/", + "level": "Media Partners" + }, + { + "name": "PyRE", + "website": "https://pyre.it", + "level": "Media Partners" + }, + { + "name": "Speck&Tech", + "website": "https://speckand.tech/", + "level": "Media Partners" + }, + { + "name": "Python Milano", + "website": "http://milano.python.it", + "level": "Media Partners" + }, + { + "name": "theRedCode", + "website": "https://www.theredcode.it/", + "level": "Media Partners" + }, + { + "name": "Schrödinger Hat", + "website": "https://www.schrodinger-hat.it/", + "level": "Media Partners" + }, + { + "name": "GDG Pisa", + "website": "https://gdgpisa.it/", + "level": "Media Partners" + }, + { + "name": "WTM Pisa", + "website": "https://gdgpisa.it/wtm", + "level": "Media Partners" + }, + { + "name": "PointerPodcast", + "website": "https://pointerpodcast.it/", + "level": "Media Partners" + }, + { + "name": "firenze.dev", + "website": "https://firenze.dev/community", + "level": "Media Partners" + }, + { + "name": "She Tech", + "website": "https://shetechitaly.org/eventi/", + "level": "Media Partners" + }, + { + "name": "WTM Italia", + "website": "https://www.facebook.com/WTMItalia", + "level": "Media Partners" + }, + { + "name": "Codemotion", + "website": "http://codemo.tech/partners", + "level": "Media Partners" + }, + { + "name": "pisa.dev", + "website": "https://pisa.dev/", + "level": "Media Partners" + }, + { + "name": "Django Girls Italia", + "website": "https://djangogirls.org/pt/bologna/", + "level": "Media Partners" + }, + { + "name": "Apogeo Editore", + "website": "https://www.apogeonline.com/", + "level": "Media Partners" + }, + { + "name": "PyBari", + "website": "https://bari.python.it/", + "level": "Media Partners" + }, + { + "name": "Python Pescara", + "website": "https://pescara.python.it/", + "level": "Media Partners" + }, + { + "name": "PyRoma", + "website": "https://t.me/pyroma", + "level": "Media Partners" + }, + { + "name": "Python Torino", + "website": "https://torino.python.it/", + "level": "Media Partners" + }, + { + "name": "Python Marche", + "website": "https://marche.python.it/", + "level": "Media Partners" + }, + { + "name": "Python Catania", + "website": "https://catania.python.it/", + "level": "Media Partners" + }, + { + "name": "PugliaTechs", + "website": "https://www.pugliatechs.com/", + "level": "Media Partners" + }, + { + "name": "AIHeroes", + "website": "https://aiheroes.it/2025/", + "level": "Media Partners" + }, + { + "name": "Refresh Academy", + "website": "https://refresh-academy.org/", + "level": "Media Partners" + }, + { + "name": "Designing Success - Community", + "website": "https://www.linkedin.com/company/designing-success-community", + "level": "Media Partners" + }, + { + "name": "PyCampania", + "website": "https://www.meetup.com/it-IT/pycampania/", + "level": "Media Partners" + } + ] +} \ No newline at end of file From 7cc84e377d33b8204ec912550325d1936955d2e1 Mon Sep 17 00:00:00 2001 From: Ester Beltrami Date: Sat, 30 Aug 2025 18:14:12 +0300 Subject: [PATCH 4/4] Add PyCon Italia 2023-2025 speaker data Add new speaker data files for PyCon Italia 2023, 2024, and 2025 in `data/speakers/PyConItalia/`. Update the `scripts/pyconitalia.py` script to support these new files. --- data/speakers/PyConItalia/2023.json | 700 ++++++++++++++++++++++++++++ data/speakers/PyConItalia/2024.json | 605 ++++++++++++++++++++++++ data/speakers/PyConItalia/2025.json | 695 +++++++++++++++++++++++++++ scripts/pyconitalia.py | 126 ++++- 4 files changed, 2101 insertions(+), 25 deletions(-) create mode 100644 data/speakers/PyConItalia/2023.json create mode 100644 data/speakers/PyConItalia/2024.json create mode 100644 data/speakers/PyConItalia/2025.json diff --git a/data/speakers/PyConItalia/2023.json b/data/speakers/PyConItalia/2023.json new file mode 100644 index 0000000..f90c3e5 --- /dev/null +++ b/data/speakers/PyConItalia/2023.json @@ -0,0 +1,700 @@ +{ + "year": 2023, + "speakers": [ + { + "fullname": "Lorenzo Barbieri", + "type": "Training", + "title": "Public Speaking Training - Become a great public speaker!" + }, + { + "fullname": "Carlton Gibson", + "type": "Keynote", + "title": "Open Source for the long-haul" + }, + { + "fullname": "Alessandro Garavaglia", + "type": "Talk", + "title": "Unit-tests for machine learning pipelines" + }, + { + "fullname": "Raul Pino", + "type": "Talk", + "title": "Ensembles of GANs as a Data Augmentation Technique for Alzheimer research" + }, + { + "fullname": "Carlo Bertini", + "type": "Talk", + "title": "Coding to interfaces: Structural Subtyping in Python" + }, + { + "fullname": "Francesco Panico", + "type": "Talk", + "title": "Coding to interfaces: Structural Subtyping in Python" + }, + { + "fullname": "Riccardo Magliocchetti", + "type": "Talk", + "title": "A simple serverless data pipeline" + }, + { + "fullname": "Paolo Melchiorre", + "type": "Talk", + "title": "Maps with Django" + }, + { + "fullname": "Aaron Bassett", + "type": "Talk", + "title": "Rust for Pythonistas" + }, + { + "fullname": "Giuseppe Mastrandrea", + "type": "Training", + "title": "Risveglia l'artista che è in te con Processing.py!" + }, + { + "fullname": "Angela Parker", + "type": "Training", + "title": "Beyond the technology: Are YOU considering the human being?" + }, + { + "fullname": "Dom Weldon", + "type": "Talk", + "title": "Serverless from scratch with CI/CD on AWS: it’s a lot easier than you think (and mostly free)." + }, + { + "fullname": "Piergiacomo Fonseca", + "type": "Talk", + "title": "Location Intelligence and Spatial Data Science: from geographic coordinates to business insights" + }, + { + "fullname": "Giovanni Barillari", + "type": "Talk", + "title": "Granian: a Rust HTTP server for Python applications" + }, + { + "fullname": "Tommaso Radicioni", + "type": "Talk", + "title": "GPT or how I learned to stop worrying and love the generative AI" + }, + { + "fullname": "Nicola Donelli", + "type": "Talk", + "title": "Intelligent Documents Management System" + }, + { + "fullname": "Lorenzo Barbieri", + "type": "Talk", + "title": "Personal Branding for Developers: stand out in the market!" + }, + { + "fullname": "Serena Sensini", + "type": "Talk", + "title": "Una libreria al giorno, toglie il medico di torno" + }, + { + "fullname": "William Arias", + "type": "Talk", + "title": "Beyond Grid Search: XGBoost and Optuna as the ultimate ML Optimization Combo " + }, + { + "fullname": "Sebastian Witowski", + "type": "Talk", + "title": "Optimizing Your CI Pipelines" + }, + { + "fullname": "Sanskar Jethi", + "type": "Talk", + "title": "Robyn: A fast async Python web framework with a Rust runtime" + }, + { + "fullname": "Fabio Lamanna", + "type": "Talk", + "title": "Map transit systems on transportation networks using GTFS Data and Infomap" + }, + { + "fullname": "Luca Gilli", + "type": "Talk", + "title": "Tests are docs and docs are tests: an introduction to great_expectations and data profiling" + }, + { + "fullname": "Samantha Cristoforetti", + "type": "Talk", + "title": "Q&A with ESA Astronaut Samantha Cristoforetti" + }, + { + "fullname": "Kushal Das", + "type": "Training", + "title": "Writing Python extensions in Rust" + }, + { + "fullname": "Rumanu Bhardwaj", + "type": "Training", + "title": "Save Sheldon" + }, + { + "fullname": "Marie Roald", + "type": "Talk", + "title": "Teaching teachers to teach Python: what have I learned?" + }, + { + "fullname": "Florian Haas", + "type": "Talk", + "title": "Creativity: How we lost it, why that’s bad, and how we get it back" + }, + { + "fullname": "Virginia Capoluongo", + "type": "Talk", + "title": "Come migliorare l’usabilità di un sito: il caso djangoproject.com" + }, + { + "fullname": "Laura Lezcano", + "type": "Talk", + "title": "Come migliorare l’usabilità di un sito: il caso djangoproject.com" + }, + { + "fullname": "Aivars Kalvāns", + "type": "Talk", + "title": "Pessimism, optimism, realism and Django database concurrency" + }, + { + "fullname": "Artem Kislovskiy", + "type": "Talk", + "title": "The bumps in the road: A retrospective on my data visualisation mistakes" + }, + { + "fullname": "Niccolò Venerandi", + "type": "Talk", + "title": "Become a Better Pythonista by Abusing List Comprehensions and :=" + }, + { + "fullname": "Avila", + "type": "Training", + "title": "The art of taking time for yourself and growing a mindful hobby" + }, + { + "fullname": "Anastasiia Tymoshchuk", + "type": "Talk", + "title": "My first 90 days, kick starting a new team for long term success" + }, + { + "fullname": "Valerio Maggio", + "type": "Talk", + "title": "The `__magic__` of the Python Model for Magic™ data" + }, + { + "fullname": "Sabrina Scoma", + "type": "Talk", + "title": "Bias: ci influenzano più di quanto pensiamo" + }, + { + "fullname": "Albert Sweigart", + "type": "Talk", + "title": "Using GUI Automation to Create APIs for API-less Desktop Apps" + }, + { + "fullname": "Joel Lord", + "type": "Talk", + "title": "Help! I Need To UnSQLize My Application" + }, + { + "fullname": "Emanuele Fabbiani", + "type": "Talk", + "title": "The hitchhiker's guide to asyncio" + }, + { + "fullname": "Darla Magdalene Shockley", + "type": "Talk", + "title": "Site reliability engineering when your team is too small for a full time SRE" + }, + { + "fullname": "Elena Guidi", + "type": "Talk", + "title": "Let's save the penguins with green computing" + }, + { + "fullname": "Giulio Piccolo", + "type": "Talk", + "title": "Saving time, money and sanity by Pythonizing Google Slides" + }, + { + "fullname": "Di Scala", + "type": "Talk", + "title": "Develop modern games in Python the old-school way" + }, + { + "fullname": "Alessandro Volpe", + "type": "Talk", + "title": "Let's do graph machine learning on Cloud" + }, + { + "fullname": "Alessandro Molina", + "type": "Talk", + "title": "Apache Arrow as a full stack data engineering solution" + }, + { + "fullname": "Anwesha Das", + "type": "Keynote", + "title": "Altering lives with communities" + }, + { + "fullname": "Marlene Mhangami", + "type": "Keynote", + "title": "Transcendence: The Power of Representation" + }, + { + "fullname": "Miriam Perrone", + "type": "Talk", + "title": "Remote teams are autistic" + }, + { + "fullname": "Justin Castilla", + "type": "Talk", + "title": "What's that smell? Monitoring air quality with Python, Raspberry Pi, and Redis" + }, + { + "fullname": "MERVE NOYAN", + "type": "Talk", + "title": "Building Data and Machine Learning Applications using Gradio" + }, + { + "fullname": "Antonio Cuni", + "type": "Talk", + "title": "The CPU in your browser: WebAssembly demystified" + }, + { + "fullname": "Patrizio Gelosi", + "type": "Talk", + "title": "Dyndesign: Merging Classes Dynamically" + }, + { + "fullname": "Andrea Guzzo", + "type": "Talk", + "title": "Creating an AI-Python Infrastructure that works with a reasonable scale" + }, + { + "fullname": "Vaibhav Srivastav", + "type": "Training", + "title": "Build with Audio: The easy & hard way!" + }, + { + "fullname": "Suman Debnath", + "type": "Training", + "title": "Getting started with Polars (when Dataframe gets little too fast)" + }, + { + "fullname": "Andrea Romoli", + "type": "Training", + "title": "The state of innovation with LEGO© SERIOUS PLAY©" + }, + { + "fullname": "Duarte Carmo", + "type": "Talk", + "title": "On scaling Machine Learning microservices" + }, + { + "fullname": "Fiorella De Luca", + "type": "Talk", + "title": "Data Discrimination" + }, + { + "fullname": "Mirko Galimberti", + "type": "Talk", + "title": "Kivy: Pythonistas can develop cross-platform (yes, even mobile) GUI Apps" + }, + { + "fullname": "Neel Shah", + "type": "Talk", + "title": "Polyglot Library Development" + }, + { + "fullname": "Alberto Danese", + "type": "Talk", + "title": "Beyond Pandas: lightning fast in-memory dataframes with Polars" + }, + { + "fullname": "Luca Baggi", + "type": "Talk", + "title": "Rust is easy" + }, + { + "fullname": "Ambra Tonon", + "type": "Talk", + "title": "La community Django Girls in Italia e Fuzzy Brains: un connubio vitale!" + }, + { + "fullname": "Juna Salviati", + "type": "Talk", + "title": "Costruire torri ed attraversare fiumi: una prospettiva diversa sui puzzle con Python" + }, + { + "fullname": "Marc-André Lemburg", + "type": "Talk", + "title": "Diving into Event-Driven Architectures (EDA) with Python - Solving complexity at scale" + }, + { + "fullname": "Danica Fine", + "type": "Talk", + "title": "Practical Pipelines: A Houseplant Alerting System with ksqlDB" + }, + { + "fullname": "Maxim Danilov", + "type": "Talk", + "title": "What are you yield from?" + }, + { + "fullname": "Anastasia Samokhina", + "type": "Talk", + "title": "Build a Frontend for Your Web App: From Basic HTML to JS Frameworks" + }, + { + "fullname": "Serena Palazzo", + "type": "Talk", + "title": "How to use Deep Learning to process audio data and classify sounds." + }, + { + "fullname": "Cheuk Ho", + "type": "Talk", + "title": "Don't just test, my friend, test better" + }, + { + "fullname": "Juliana Nicacio", + "type": "Talk", + "title": "La mia prima esperienza di contribuzione ad un progetto Open Source" + }, + { + "fullname": "Jonathan Striebel", + "type": "Talk", + "title": "How to Tune your Python Analysis Pipeline: A Profiler Guide" + }, + { + "fullname": "Daniel Roy Greenfeld", + "type": "Talk", + "title": "No Holds Barred Web Framework Battle" + }, + { + "fullname": "Dr. Patrick Schemitz", + "type": "Talk", + "title": "How Not to Repeat Yourself - pydantic, YAML, Connexion and all the REST of it." + }, + { + "fullname": "Karen Jex", + "type": "Training", + "title": "Everything You Wanted to Know About Databases as a Developer but Were Too Afraid to Ask Your DBA" + }, + { + "fullname": "Marco Zamboni", + "type": "Training", + "title": "Backpropagation is \"easy\"!" + }, + { + "fullname": "Fiorella De Luca", + "type": "Training", + "title": "Non autosabotarti, smaschera l’impostore che è in te!" + }, + { + "fullname": "Ambra Tonon", + "type": "Training", + "title": "Non autosabotarti, smaschera l’impostore che è in te!" + }, + { + "fullname": "Sabrina Scoma", + "type": "Training", + "title": "Non autosabotarti, smaschera l’impostore che è in te!" + }, + { + "fullname": "Marco Rossi", + "type": "Talk", + "title": "Speed up Python with hardware accelerators" + }, + { + "fullname": "Flavio Percoco", + "type": "Talk", + "title": "Striving for simplicity: Creating software that is simple to use and easy to maintain" + }, + { + "fullname": "Alexander Hendorf", + "type": "Talk", + "title": "5 Things about fastAPI I wish we had known beforehand" + }, + { + "fullname": "Justin Mayer", + "type": "Talk", + "title": "Open Source Is Eating the World" + }, + { + "fullname": "Stefano Fiorucci", + "type": "Talk", + "title": "Fact Checking Rocks! - How to build a fact checking system for rock music" + }, + { + "fullname": "Maciej Marzęta", + "type": "Talk", + "title": "PEP 8: How to Avoid Being a Python Hooligan" + }, + { + "fullname": "Lorenzo Addazi", + "type": "Talk", + "title": "Let's talk about transpilers!" + }, + { + "fullname": "Jonathan Oberländer", + "type": "Talk", + "title": "Trace functions: Building a tiny debugger" + }, + { + "fullname": "Mattia Ferrini", + "type": "Talk", + "title": "Decision sciences in Python" + }, + { + "fullname": "Marcelo Trylesinski", + "type": "Talk", + "title": "What does Starlette really do for FastAPI?" + }, + { + "fullname": "Pelucchi Mauro", + "type": "Talk", + "title": "Data Warehouses Meet Data Lakes" + }, + { + "fullname": "Roberto Polli", + "type": "Talk", + "title": "Cybersecurity in the semantic web with MITRE D3FEND" + }, + { + "fullname": "Priyanshi Goel", + "type": "Talk", + "title": "Debugging that bugger : Cleanly handling the errors" + }, + { + "fullname": "Hemangi Subodh Karchalkar", + "type": "Talk", + "title": "From WSGI to ASGI - Django 3.0" + }, + { + "fullname": "Christina Dahlén", + "type": "Talk", + "title": "Efficient Communication Between Python Microservices using LavinMQ" + }, + { + "fullname": "Nyior Clement", + "type": "Talk", + "title": "Efficient Communication Between Python Microservices using LavinMQ" + }, + { + "fullname": "Radovan Bacovic", + "type": "Talk", + "title": "Do the magic with DevOps, Open Source and All-remote teams (with Python, of course)" + }, + { + "fullname": "Andrea Guarino", + "type": "Talk", + "title": "Managing the code quality of your project. Leave the past behind: Focus on new code." + }, + { + "fullname": "Peter Bittner", + "type": "Talk", + "title": "Smettiamola di scrivere script! Applicazioni CLI con TDD." + }, + { + "fullname": "Donatella Taurasi", + "type": "Keynote", + "title": "Learning the Other \"Full Stack\": An epistle from business to the technical people." + }, + { + "fullname": "Anna Martelli Ravenscroft", + "type": "Talk", + "title": "What we learned by writing and editing the 4th edition of Python in a Nutshell" + }, + { + "fullname": "Alex Martelli", + "type": "Talk", + "title": "What we learned by writing and editing the 4th edition of Python in a Nutshell" + }, + { + "fullname": "Emily Morehouse-Valcarcel", + "type": "Keynote", + "title": "Stay Curious: Reflections on Passion, Risk-Taking, and Re-Invention" + }, + { + "fullname": "sagie shamay", + "type": "Talk", + "title": "Running your Django WebAuthN service" + }, + { + "fullname": "Pietro Mascolo", + "type": "Talk", + "title": "Bringing life and motion to AI Explainability" + }, + { + "fullname": "Joao Nogueira", + "type": "Talk", + "title": "Bringing life and motion to AI Explainability" + }, + { + "fullname": "Federico Belotti", + "type": "Talk", + "title": "ChatGPT and Minecraft's diamonds playing agents: Reinforcement Learning in a nutshell with sheeprl" + }, + { + "fullname": "Pier Paolo Ippolito", + "type": "Talk", + "title": "Paradoxes in Data Science" + }, + { + "fullname": "Alexander Darby", + "type": "Talk", + "title": "Hack Your Own Code" + }, + { + "fullname": "Kacper Szczepanek", + "type": "Training", + "title": "Infrastructure as a Code in Python with AWS CDK" + }, + { + "fullname": "Sami Musallam", + "type": "Training", + "title": "Troubleshooting and Monitoring Production Applications with OpenTelemetry" + }, + { + "fullname": "Fabio Rotondo", + "type": "Talk", + "title": "restest - Il coltellino svizzero per i test di endpoint REST in Python" + }, + { + "fullname": "Sanskar Jethi", + "type": "Talk", + "title": "Robyn: A fast async Python web framework with a Rust runtime" + }, + { + "fullname": "Alan Franzoni", + "type": "Talk", + "title": "Tech and the Italy: spunti di management IT per il Belpaese" + }, + { + "fullname": "Vikram Waradpande", + "type": "Talk", + "title": "Working with multiple hands: Parallel and Distributed Programming" + }, + { + "fullname": "Sarthika Dhawan", + "type": "Talk", + "title": "Working with multiple hands: Parallel and Distributed Programming" + }, + { + "fullname": "Mackenzie Jackson", + "type": "Talk", + "title": "Exploiting Leaked Credentials - How python code is leaking millions of secrets" + }, + { + "fullname": "Iacopo Spalletti", + "type": "Talk", + "title": "Domare il pony: configurare django è difficile?" + }, + { + "fullname": "REFIK CAN MALLI", + "type": "Talk", + "title": "Controlling the Chaos: Reproducible Deep Learning Experiments Using Lightning and Hydra" + }, + { + "fullname": "Adrin Jalali", + "type": "Talk", + "title": "Let’s exploit pickle, and `skops` to the rescue!" + }, + { + "fullname": "Jean-Luc Stevens", + "type": "Talk", + "title": "HoloViz: Visualization and Interactive Dashboards in Python" + }, + { + "fullname": "Dave Klein", + "type": "Talk", + "title": "Real-time Event Streaming with Python" + }, + { + "fullname": "Aya Elsayed", + "type": "Training", + "title": "You CAN teach an old doc new tricks: Automate your project documentation using Sphinx+GitHub Actions" + }, + { + "fullname": "Olga Matoula", + "type": "Training", + "title": "You CAN teach an old doc new tricks: Automate your project documentation using Sphinx+GitHub Actions" + }, + { + "fullname": "Stefanie Molin", + "type": "Training", + "title": "Beyond the Basics: Data Visualization in Python" + }, + { + "fullname": "Furkan M. Torun", + "type": "Talk", + "title": "How to Build an Open-Source Machine Learning Platform in Biology?" + }, + { + "fullname": "Ester Beltrami", + "type": "Talk", + "title": "Workplace culture is not just a fashion trend!" + }, + { + "fullname": "Tommaso Furlanello", + "type": "Talk", + "title": "Code Debugging and Refactoring with OpenBugger: a Python Library for Self-Supervised AI Debuggers" + }, + { + "fullname": "Luca Baggi", + "type": "Talk", + "title": "Is the great dataframe showdown finally over? Enter: polars" + }, + { + "fullname": "Sarthika Dhawan", + "type": "Talk", + "title": "You've got trust issues, we've got solutions: Differential Privacy" + }, + { + "fullname": "Vikram Waradpande", + "type": "Talk", + "title": "You've got trust issues, we've got solutions: Differential Privacy" + }, + { + "fullname": "Mario Migliaccio", + "type": "Talk", + "title": "Network analysis inside the Italian parliament" + }, + { + "fullname": "Emanuele Fabbiani", + "type": "Talk", + "title": "Serverless Computing for Mathematical Optimization" + }, + { + "fullname": "Stefania Delprete", + "type": "Talk", + "title": "Introduction to AI Safety. Let's be ready before it's too late!" + }, + { + "fullname": "H. Josiah Raj", + "type": "Talk", + "title": "Decoding Binary Files - a Primer (specifically optical spectra for analysis)" + }, + { + "fullname": "Jan Giacomelli", + "type": "Talk", + "title": "Celery on AWS ECS" + }, + { + "fullname": "Nicola Landro", + "type": "Talk", + "title": "Scraping o UI-Automation? Da livello scimmia a pro!" + }, + { + "fullname": "Fabio Lipreri", + "type": "Talk", + "title": "Pandas on Steroids" + }, + { + "fullname": "Filippo Pinton", + "type": "Talk", + "title": "Write portable CI/CD pipelines using Python" + } + ] +} \ No newline at end of file diff --git a/data/speakers/PyConItalia/2024.json b/data/speakers/PyConItalia/2024.json new file mode 100644 index 0000000..f64f2df --- /dev/null +++ b/data/speakers/PyConItalia/2024.json @@ -0,0 +1,605 @@ +{ + "year": 2024, + "speakers": [ + { + "fullname": "Lorenzo Barbieri", + "type": "Training", + "title": "Corso Public Speaking" + }, + { + "fullname": "Jodie Burchell", + "type": "Keynote", + "title": "Mirror, mirror: LLMs and the illusion of humanity" + }, + { + "fullname": "David Berenstein", + "type": "Talk", + "title": "🧼 From GPU-poor to data-rich: data quality practices for LLM fine-tuning" + }, + { + "fullname": "Ruslan Kiyanchuk", + "type": "Talk", + "title": "Mastering Cryptography in Python: Best Practices and Myth-Busting" + }, + { + "fullname": "Raffaele Colace", + "type": "Talk", + "title": "Il software funzionante è il principale metro di misura di progresso" + }, + { + "fullname": "Adrin Jalali", + "type": "Talk", + "title": "Dynamically generated methods with a non-generic signature" + }, + { + "fullname": "Alessandro Romano", + "type": "Talk", + "title": "Pandas, Polars and the DataFrame Consortium." + }, + { + "fullname": "Luca Baggi", + "type": "Talk", + "title": "functime: a next generation ML forecasting library powered by Polars" + }, + { + "fullname": "Gintare Statkute", + "type": "Training", + "title": "Memray 101: Demystifying memory profiling in Python" + }, + { + "fullname": "Jesse Carnaxide", + "type": "Training", + "title": "Memray 101: Demystifying memory profiling in Python" + }, + { + "fullname": "Lorenzo Turrino", + "type": "Training", + "title": "Instrumenting Python: build a full telemetry pipeline with OpenTelemetry, Prometheus and Grafana" + }, + { + "fullname": "Stefano Fiorucci", + "type": "Talk", + "title": "Large Language Models for Devs: from zero to your first LLM application" + }, + { + "fullname": "Rodrigo Girão Serrão", + "type": "Talk", + "title": "Descriptors made easy" + }, + { + "fullname": "Christian Heitzmann", + "type": "Talk", + "title": "Documenting Python Code" + }, + { + "fullname": "Ricardo Sueiras", + "type": "Talk", + "title": "Next Generation Authorisation using Cedar" + }, + { + "fullname": "Marco Gorelli", + "type": "Talk", + "title": "How you can write a dataframe-agnostic library" + }, + { + "fullname": "Fabio Lamanna", + "type": "Talk", + "title": "Sit back, relax, and enjoy the talk: a journey through FlightRadar24 with Python" + }, + { + "fullname": "Lemaitre Guillaume", + "type": "Talk", + "title": "A Retrieval Augmented Generation system to query the scikit-learn documentation" + }, + { + "fullname": "Katharina Rasch", + "type": "Talk", + "title": "AI on a Microbudget - Methods of Machine Learning Miniaturization" + }, + { + "fullname": "Christian Staudt", + "type": "Talk", + "title": "AI on a Microbudget - Methods of Machine Learning Miniaturization" + }, + { + "fullname": "Artem Kislovskiy", + "type": "Talk", + "title": "Simplifying Python Code through the Lens of Functional Programming" + }, + { + "fullname": "Jorge Martinez Gomez", + "type": "Talk", + "title": "Demystifying Oauth2 Authorization framework" + }, + { + "fullname": "Miroslav Šedivý", + "type": "Talk", + "title": "Solving Two Hard Problems in Computer Science Using Pandas" + }, + { + "fullname": "Pietro Mascolo", + "type": "Talk", + "title": "I have no clue what my model is doing..." + }, + { + "fullname": "Laís Carvalho", + "type": "Talk", + "title": "Python and Freedom and Bias" + }, + { + "fullname": "Tim Paine", + "type": "Talk", + "title": "High Performance Data Visualization for the Web" + }, + { + "fullname": "Riccardo Magliocchetti", + "type": "Talk", + "title": "Is Django async yet?" + }, + { + "fullname": "Armuzza", + "type": "Talk", + "title": "Django, Metadati e Inspire: come catalogare dati geospaziali grazie a Python " + }, + { + "fullname": "Erik Wrede", + "type": "Talk", + "title": "Rewrite everything in Rust? What we learned from introducing Rust in Strawberry-GraphQL" + }, + { + "fullname": "Francesco Panico", + "type": "Talk", + "title": "Zero waste: trucchi per riciclare (la memoria) meglio" + }, + { + "fullname": "Carlo Bertini", + "type": "Talk", + "title": "Zero waste: trucchi per riciclare (la memoria) meglio" + }, + { + "fullname": "Giuseppe Mastrandrea", + "type": "Training", + "title": "Train-Prey-Deploy: the journey of a ML model from the cradle to the online" + }, + { + "fullname": "Quazi Nafiul Islam", + "type": "Training", + "title": "Calling Rust from Python: A Gentle Introduction to PyO3" + }, + { + "fullname": "Thiago Bellini Ribeiro", + "type": "Talk", + "title": "Building high-performance, type-safe GraphQL APIs with Strawberry and Django" + }, + { + "fullname": "Andrii Soldatenko", + "type": "Talk", + "title": "Debugging python applications inside k8s environment" + }, + { + "fullname": "Artur Patoka", + "type": "Talk", + "title": "Testing for Ghosts in the Machine: Assuring 'Good Enough' Software Quality in AI-based systems" + }, + { + "fullname": "Jill Cates", + "type": "Talk", + "title": "How to Handle Very Large Data with Python" + }, + { + "fullname": "Mia Bajić", + "type": "Talk", + "title": "Combining Django ORM & FastAPI in a Data Visualization Tool" + }, + { + "fullname": "Emiel Veersma", + "type": "Talk", + "title": "From Pixels to Plots: Transforming Lives of African Smallholder Farmers through Geospatial Data" + }, + { + "fullname": "Andrea Purgato", + "type": "Talk", + "title": "Data VS Engineers: a long lasting story" + }, + { + "fullname": "Federica Previ", + "type": "Talk", + "title": "Data VS Engineers: a long lasting story" + }, + { + "fullname": "Yash Saboo", + "type": "Talk", + "title": "Code More, Draw Less, and Debug Just a Little!" + }, + { + "fullname": "Nefta Kanilmaz", + "type": "Talk", + "title": "Analyzing COVID-19 Protest Movements: A Multidimensional Approach Using Geo-Social Media Data" + }, + { + "fullname": "Shirli Di-Castro", + "type": "Talk", + "title": "AI, SQL, and GraphQL Walk into a Fertility Clinic… LLM-based Medical feature development" + }, + { + "fullname": "Davide Poggiali", + "type": "Talk", + "title": "streamlit vs gradio: which to pick?" + }, + { + "fullname": "Anton Caceres", + "type": "Talk", + "title": "Enhancing AsyncIO for Complex Applications" + }, + { + "fullname": "Daniel Roy Greenfeld", + "type": "Keynote", + "title": "Scaling Yourself: Make an Impact to Billions" + }, + { + "fullname": "Daniele Procida", + "type": "Keynote", + "title": "The attentive programmer" + }, + { + "fullname": "Ilyas Chaoua", + "type": "Talk", + "title": "Scaling Machine Learning Training and Inference" + }, + { + "fullname": "Cesare Placanica", + "type": "Talk", + "title": "Sviluppare operatori kubernetes \"Pythonicamente\"" + }, + { + "fullname": "Ines Montani", + "type": "Talk", + "title": "The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs" + }, + { + "fullname": "Adrian Garcia Badaracco", + "type": "Talk", + "title": "Modern observability for Python" + }, + { + "fullname": "Alan Franzoni", + "type": "Talk", + "title": "Typing at scale: statically type-checking a large codebase" + }, + { + "fullname": "Stefanie Molin", + "type": "Talk", + "title": "Getting Started with Open Source Contributions" + }, + { + "fullname": "Leonardo Giordani", + "type": "Training", + "title": "TDD in Python con pytest" + }, + { + "fullname": "Valerio Maggio", + "type": "Training", + "title": "PPML: Machine learning on data you cannot see" + }, + { + "fullname": "Florian Haas", + "type": "Talk", + "title": "Quit Simplifying!" + }, + { + "fullname": "Vaibhav Srivastav", + "type": "Talk", + "title": "Speeding up Whisper for speech recognition by 10x - Optimisations and walkthrough" + }, + { + "fullname": "Fagani Hajizada", + "type": "Talk", + "title": "Building a self-service kubernetes platform for python developers" + }, + { + "fullname": "Peter Bittner", + "type": "Talk", + "title": "Pythonic deployment of (Python) applications" + }, + { + "fullname": "Luciano Ramalho", + "type": "Talk", + "title": "Pythonic type hints with typing.Protocol" + }, + { + "fullname": "Alexander Hendorf", + "type": "Talk", + "title": "Ten Years of Community Organizer" + }, + { + "fullname": "Yossi Rozantsev", + "type": "Talk", + "title": "Writing Beautiful, Simple, and Safe Operations Scripts with Python" + }, + { + "fullname": "Tommaso Radicioni", + "type": "Talk", + "title": "RAGtime with Haystack! How to build a RAG with Haystack 2.0? " + }, + { + "fullname": "Marcelo Trylesinski", + "type": "Talk", + "title": "Logfire - Uncomplicated Observability" + }, + { + "fullname": "Adrian Garcia Badaracco", + "type": "Talk", + "title": "Logfire - Uncomplicated Observability" + }, + { + "fullname": "Damian Wysocki", + "type": "Talk", + "title": "Blue-Green Deployment in Action: A Real Case Study" + }, + { + "fullname": "Nicola Guglielmi", + "type": "Talk", + "title": "Da 100 a 100M utenti: come scalare le tue architetture cloud!🚀" + }, + { + "fullname": "Lorenzo Mele", + "type": "Talk", + "title": "Oltre il Codice: Che Ruolo ha la Filosofia nella Programmazione?" + }, + { + "fullname": "Maciej Marzęta", + "type": "Talk", + "title": "FastAPI: Hitting the Performance Jackpot" + }, + { + "fullname": "Serena Palazzo", + "type": "Talk", + "title": "A Journey through Generative AI's Frontier Python Libraries" + }, + { + "fullname": "Nicolò Giso", + "type": "Talk", + "title": "Exploring Art with Python: Building an Italian Art Bot" + }, + { + "fullname": "Ievgen Burdin", + "type": "Talk", + "title": "From Domain to Delivery: End-to-End Clean Architecture in Python" + }, + { + "fullname": "Pietro Peterlongo", + "type": "Talk", + "title": "Nim for Pythonistas" + }, + { + "fullname": "Luca Corbucci", + "type": "Talk", + "title": "Is your model private?" + }, + { + "fullname": "Jan Pipek", + "type": "Training", + "title": "Data Analysis, the Polars Way" + }, + { + "fullname": "Aya Elsayed", + "type": "Training", + "title": "No More Raw SQL: SQLAlchemy, ORMs & asyncio" + }, + { + "fullname": "Rhythm Patel", + "type": "Training", + "title": "No More Raw SQL: SQLAlchemy, ORMs & asyncio" + }, + { + "fullname": "Yullia Barabash", + "type": "Talk", + "title": "Is it me or Python memory management? 🤔💻" + }, + { + "fullname": "Rashmi Nagpal", + "type": "Talk", + "title": "Beyond Bias: Crafting Fairness in Pythonic Machine Learning Systems" + }, + { + "fullname": "Adarsh Kumar", + "type": "Talk", + "title": "Let’s make the world a better place: Python for Social Good" + }, + { + "fullname": "Siddharta Govindaraj", + "type": "Talk", + "title": "Supercharge your code with Python's 'match' statement" + }, + { + "fullname": "Marcelo Trylesinski", + "type": "Talk", + "title": "FastAPI Internals - How does it work?" + }, + { + "fullname": "Bernice Waweru", + "type": "Talk", + "title": "Tricking Neural Networks : Explore Adversarial Attacks" + }, + { + "fullname": "Egon Ferri", + "type": "Talk", + "title": "Computer Vision IRL: dall'idea al deploy on-premise" + }, + { + "fullname": "Vinícius Gubiani Ferreira", + "type": "Talk", + "title": "PEP 683: Immortal Objects - A new approach for memory managing" + }, + { + "fullname": "Marc-André Lemburg", + "type": "Talk", + "title": "Advanced parsing of structured data using Python's new match statement" + }, + { + "fullname": "Luca Gilli", + "type": "Talk", + "title": "The European AI Act: a data scientist’s perspective" + }, + { + "fullname": "Oliver Rew", + "type": "Talk", + "title": "Designing a Human-Friendly CLI for API-Driven Infrastructure" + }, + { + "fullname": "Sheena O'Connell", + "type": "Keynote", + "title": "A Tale from the Trenches" + }, + { + "fullname": "Antonio Cuni", + "type": "Keynote", + "title": "Myths and fairy tales around Python performance" + }, + { + "fullname": "Hemangi Subodh Karchalkar", + "type": "Talk", + "title": "From Pydantic V1 to V2" + }, + { + "fullname": "Simone Pulcini", + "type": "Talk", + "title": "Release it like a pro!" + }, + { + "fullname": "Luigi Giuseppe Corollo", + "type": "Talk", + "title": "Release it like a pro!" + }, + { + "fullname": "Simona Mazzarino", + "type": "Talk", + "title": "Preservare la Privacy dei Dati Personali nell'Era dell'IA: Un Approccio Pratico con Nerpii" + }, + { + "fullname": "Cheuk Ho", + "type": "Talk", + "title": "Acknowledging Women’s Contributions in the Python Community Through Podcast" + }, + { + "fullname": "David Seddon", + "type": "Talk", + "title": "Crabs in Snakes!" + }, + { + "fullname": "Vincenzo Maritati", + "type": "Training", + "title": "Space Invaders: un approccio custom in Reinforcement Learning" + }, + { + "fullname": "Navid Nobani", + "type": "Training", + "title": "Essentials of Generative Models" + }, + { + "fullname": "Loris Cro", + "type": "Talk", + "title": "Deinventing the Wheel" + }, + { + "fullname": "Nicola Procopio", + "type": "Talk", + "title": "Don’t get lost in Vector Space" + }, + { + "fullname": "Iga Karbowiak", + "type": "Talk", + "title": "Adding zero-downtime migrations strategy in SaaS project" + }, + { + "fullname": "Mara Marzocchi", + "type": "Talk", + "title": "Sii il cambiamento che vuoi vedere nel mondo " + }, + { + "fullname": "Anže Pečar", + "type": "Talk", + "title": "Self hosting your side projects with Django and duct tape" + }, + { + "fullname": "Melhin Ahammad", + "type": "Talk", + "title": "Django 5.0: Elevating Experiences with Server-Sent Events – A Journey from Polling to Real-Time Vibe" + }, + { + "fullname": "Davide Brunato", + "type": "Talk", + "title": "Abstract tricks: how abstract base classes can help you to solve difficult challenges." + }, + { + "fullname": "William Arias", + "type": "Talk", + "title": "🤑 Paying Off Technical Debt in the Development of Machine Learning Apps" + }, + { + "fullname": "Paolo Melchiorre", + "type": "Talk", + "title": "Many ways to be a Python contributor" + }, + { + "fullname": "Karen Jex", + "type": "Talk", + "title": "Optimising your Database for Analytics" + }, + { + "fullname": "Luca Baggi", + "type": "Talk", + "title": "Embeddings, Transformers, RLHF: Three key ideas to understand ChatGPT" + }, + { + "fullname": "Bryce Beagle ", + "type": "Talk", + "title": "Importing Without \"import\": Behind the Scenes of importlib" + }, + { + "fullname": "Juna Salviati", + "type": "Talk", + "title": "Infiniti mondi da set finiti di tessere: un approccio \"quantum\" all'arte generativa" + }, + { + "fullname": "Viktor Zagranovskyy", + "type": "Talk", + "title": "Scraping the Dungeons. Find your perfect D&D game using Scrapy and Bokeh visualisation" + }, + { + "fullname": "Roman Prykhodchenko", + "type": "Talk", + "title": "Python-friendly cloud infrastructure management" + }, + { + "fullname": "Rodrigo Girão Serrão", + "type": "Talk", + "title": "503 days working full time on FOSS: lessons learned" + }, + { + "fullname": "Swastika Yadav", + "type": "Talk", + "title": "Understanding the Magic of Python Modules and Packages" + }, + { + "fullname": "Kristi Perreault", + "type": "Talk", + "title": "Snakes and Ladders: The Ups and Downs of Python Development with AWS Lambda" + }, + { + "fullname": "Jacek Kołodziej", + "type": "Talk", + "title": "GIL: What's the hassle and... should I care?" + }, + { + "fullname": "Scott Chacon", + "type": "Talk", + "title": "So you think you know Git: Advanced Git Tips and Tricks" + }, + { + "fullname": "Vicki Boykis", + "type": "Keynote", + "title": "Stay Close to the Metal" + } + ] +} \ No newline at end of file diff --git a/data/speakers/PyConItalia/2025.json b/data/speakers/PyConItalia/2025.json new file mode 100644 index 0000000..eb5be5f --- /dev/null +++ b/data/speakers/PyConItalia/2025.json @@ -0,0 +1,695 @@ +{ + "year": 2025, + "speakers": [ + { + "fullname": "Lorenzo Barbieri", + "type": "Training", + "title": "Corso Public Speaking" + }, + { + "fullname": "Giuseppe Mastrandrea", + "type": "Training", + "title": "Beginner's Workshop" + }, + { + "fullname": "Stefania Delprete", + "type": "Training", + "title": "Humble Data - Learn Python and Data Science from scratch!" + }, + { + "fullname": "Paolo Melchiorre", + "type": "Training", + "title": "Djangonauts" + }, + { + "fullname": "Sarah Abderemane", + "type": "Training", + "title": "Djangonauts" + }, + { + "fullname": "Sheena", + "type": "Training", + "title": "Djangonauts" + }, + { + "fullname": "Raffaella Suardini", + "type": "Training", + "title": "Djangonauts" + }, + { + "fullname": "Andrea Grandi", + "type": "Training", + "title": "Python Dojo" + }, + { + "fullname": "Nicholas Tollervey", + "type": "Training", + "title": "Python Dojo" + }, + { + "fullname": "Seemin Suleri", + "type": "Keynote", + "title": "From Struggle to Stardom: The Secret Sauce of High Performance Teams" + }, + { + "fullname": "Spela Giacomelli", + "type": "Talk", + "title": "Best buddies: Django and HTMX" + }, + { + "fullname": "Giulia De Poli", + "type": "Talk", + "title": "Rivoluzione LLM: Necessità o Eccesso? Uno studio sulle soluzioni più efficienti" + }, + { + "fullname": "Giuseppe Lovino", + "type": "Talk", + "title": "Rivoluzione LLM: Necessità o Eccesso? Uno studio sulle soluzioni più efficienti" + }, + { + "fullname": "Francesco Lucantoni", + "type": "Talk", + "title": "Working with Data Scientists and why I left my job (not)" + }, + { + "fullname": "Saurav Jain", + "type": "Talk", + "title": "Build, Deploy, Monetize: The Future of the Developer Economy" + }, + { + "fullname": "Karen Jex", + "type": "Talk", + "title": "Postgres Partitioning Best Practices" + }, + { + "fullname": "Andrea Griffini", + "type": "Talk", + "title": "Cose a caso su problemi difficili" + }, + { + "fullname": "Leonardo Cavagnis", + "type": "Training", + "title": "Arduino e MicroPython: Soluzioni IoT dal Sensore al Cloud" + }, + { + "fullname": "Claudio Giorgio Giancaterino", + "type": "Training", + "title": "Building Intelligent Agents with RAG and AutoGen" + }, + { + "fullname": "Luca Palmieri", + "type": "Training", + "title": "Rust-Python interoperability" + }, + { + "fullname": "Yash Raj", + "type": "Talk", + "title": "Boosting Python Web Apps performance with Celery and Concurrency" + }, + { + "fullname": "Serena Sensini", + "type": "Talk", + "title": "Intelligence avversaria: usare GAN nella cybersecurity" + }, + { + "fullname": "David Berenstein", + "type": "Talk", + "title": "🤯 No data? No problem! Synthetic data to the rescue" + }, + { + "fullname": "Paolo Melchiorre", + "type": "Talk", + "title": "A Pythonic semantic search" + }, + { + "fullname": "Antonio Spadaro", + "type": "Talk", + "title": "Design by Contract: costruire software robusto con il Contract-First Development" + }, + { + "fullname": "Salvatore Giammanco", + "type": "Talk", + "title": "Under the Hood of Python Data Structures" + }, + { + "fullname": "Simona Mazzarino", + "type": "Talk", + "title": "Democratizing Data: A deep dive into Eurostat Open Database" + }, + { + "fullname": "Andrew Stroev", + "type": "Talk", + "title": "Live audio synthesis with Synchrotron" + }, + { + "fullname": "Matteo Maria Terzuolo", + "type": "Talk", + "title": "Python & Flutter: can birds and snakes really be friends?" + }, + { + "fullname": "Noam Cattan", + "type": "Talk", + "title": "Beyond Alembic and Django Migrations" + }, + { + "fullname": "Data Office", + "type": "Talk", + "title": "Making EPUBs Accessible with AI: A Serverless Pipeline for Automated Alt Text Generation" + }, + { + "fullname": "Marcelo Trylesinski", + "type": "Talk", + "title": "Generative AI Monitoring with PydanticAI and Logfire" + }, + { + "fullname": "Fabio Pliger", + "type": "Talk", + "title": "The marvelous world of Python in Browser: a nice surprise" + }, + { + "fullname": "Michele Zanchi", + "type": "Talk", + "title": "Python, YOLO e Kubernetes: la Super-Visione di un impianto industriale" + }, + { + "fullname": "Alessandro Cosentino", + "type": "Talk", + "title": "Quantum computing without leaving Python behind" + }, + { + "fullname": "Marina Caporlingua", + "type": "Talk", + "title": "Italy-Finland climate round trip with Python" + }, + { + "fullname": "Elisa Bestetti", + "type": "Talk", + "title": "Italy-Finland climate round trip with Python" + }, + { + "fullname": "Tereza Iofciu", + "type": "Talk", + "title": "Behind the Data: Unraveling Leadership Challenges in the LLM Era" + }, + { + "fullname": "Pietro Peterlongo", + "type": "Talk", + "title": "Domain-driven Data Science" + }, + { + "fullname": "Melloncelli", + "type": "Training", + "title": "Hands-On Workshop: Programming a Quantum Computer with Python" + }, + { + "fullname": "Rigel Di Scala", + "type": "Training", + "title": "Learn asyncio by writing the fastest crypto-miner!" + }, + { + "fullname": "Giulio Melloni", + "type": "Training", + "title": "Databricks Delta Live Tables: Data Engineering made easy" + }, + { + "fullname": "Andrea Calegari", + "type": "Training", + "title": "Databricks Delta Live Tables: Data Engineering made easy" + }, + { + "fullname": "Caio Costa Salgado", + "type": "Talk", + "title": "No more Locks! What can we achieve without the GIL" + }, + { + "fullname": "Pietro Mascolo", + "type": "Talk", + "title": "Graph-Based Machine Learning with Python" + }, + { + "fullname": "Castellani", + "type": "Talk", + "title": "Capire il cambiamento climatico con Python: dal rapporto IPCC all’azione climatica" + }, + { + "fullname": "Andrii Soldatenko", + "type": "Talk", + "title": "The essense of Graceful Shutdown" + }, + { + "fullname": "Juna Salviati", + "type": "Talk", + "title": "Pixel e Particelle: quando l’arte generativa incontra il Quantum Computing" + }, + { + "fullname": "Emanuele Fabbiani", + "type": "Talk", + "title": "Langfuse, OpenLIT, and Phoenix: Observability for the GenAI Era" + }, + { + "fullname": "Archana Vaidheeswaran", + "type": "Talk", + "title": "Back to Basics: Cutting Through the AI-Generated Code Noise" + }, + { + "fullname": "Daniele Giunta", + "type": "Talk", + "title": "Local LLM fine-tuning: a practical example" + }, + { + "fullname": "Stefano Fiorucci", + "type": "Talk", + "title": "Post-Training Small Language Models: the adventures of a practitioner" + }, + { + "fullname": "Davide Gerosa", + "type": "Talk", + "title": "Black holes and gravitational waves are discovered (also) with Python!" + }, + { + "fullname": "Peter Bittner", + "type": "Talk", + "title": "Pitonisti! Ecco l'ambiente di sviluppo perfetto! Edizione 2025 (NixOS)" + }, + { + "fullname": "Alessandro Molina", + "type": "Keynote", + "title": "Composable Data Systems, the new frontier" + }, + { + "fullname": "Alex Martelli", + "type": "Keynote", + "title": "Lessons from a lifetime of doing, teaching, managing, and leading technical development" + }, + { + "fullname": "Anastasiia Tymoshchuk", + "type": "Talk", + "title": "Continuous Documentation: basics and advanced techniques" + }, + { + "fullname": "Vaibhav Srivastav", + "type": "Talk", + "title": "Hugging Face ecosystem for Local AI/ ML" + }, + { + "fullname": "Serban Cristian Tudosie", + "type": "Talk", + "title": "Reconstructing Unseen Dimensions in Biophotonics Through Python" + }, + { + "fullname": "Duarte Carmo", + "type": "Talk", + "title": "RAG: Tricks from the trenches." + }, + { + "fullname": "Carlos A Aranibar", + "type": "Talk", + "title": "Designing and Building Custom Keyboards ⌨️ with Python" + }, + { + "fullname": "Daniele Maccagnola", + "type": "Talk", + "title": "Crash detector" + }, + { + "fullname": "Angela Addesso", + "type": "Talk", + "title": "Crash detector" + }, + { + "fullname": "Giovanna Reggina GALLENO MALAGA", + "type": "Training", + "title": "Designing your Success!" + }, + { + "fullname": "Gianfranco Castro", + "type": "Training", + "title": "FastAPI: from Hello World to Production" + }, + { + "fullname": "Marco Gorelli", + "type": "Training", + "title": "Learn Polars in just half-a-day!" + }, + { + "fullname": "Michele Mondelli", + "type": "Talk", + "title": "Efficient AI with Python: running AI models on CPUs" + }, + { + "fullname": "Maren Westermann", + "type": "Talk", + "title": "I feel like writing software documentation is like doing my taxes - help!" + }, + { + "fullname": "Marc-André Lemburg", + "type": "Talk", + "title": "Programming hardware displays the easy way - using MicroPython and LVGL" + }, + { + "fullname": "Diana Bernabei", + "type": "Talk", + "title": "Componenti accessibili e zero framework" + }, + { + "fullname": "Bryce Beagle ", + "type": "Talk", + "title": "Hot-swapping Symbols During Tests: Demystifying unittest.mock[.patch]" + }, + { + "fullname": "Iryna Kondrashchenko", + "type": "Talk", + "title": "Is Prompt Engineering Dead? How Auto-Optimization is Changing the Game" + }, + { + "fullname": "Oleh Kostromin", + "type": "Talk", + "title": "Is Prompt Engineering Dead? How Auto-Optimization is Changing the Game" + }, + { + "fullname": "Oliver Rew", + "type": "Talk", + "title": "Python Untethered: Building Robust Embedded Systems" + }, + { + "fullname": "Peichao Qin", + "type": "Talk", + "title": "Fast Jigsaw Puzzle Solving with Python: From CV Algorithms to Applications" + }, + { + "fullname": "Mykalin Jones", + "type": "Talk", + "title": "Supporting Adult Career Switchers: The Unbootcamp Method" + }, + { + "fullname": "Luka Raljević", + "type": "Talk", + "title": "UX is frontend only! Why do I, super ninja backend developer, need to care about it?" + }, + { + "fullname": "Klemenčić", + "type": "Talk", + "title": "UX is frontend only! Why do I, super ninja backend developer, need to care about it?" + }, + { + "fullname": "Stefanie Molin", + "type": "Talk", + "title": "Data Morph: A Cautionary Tale of Summary Statistics" + }, + { + "fullname": "Antonio Cuni", + "type": "Talk", + "title": "SPy (Static Python) lang: fast as C, Pythonic as Python" + }, + { + "fullname": "Giulio Melloni", + "type": "Talk", + "title": "From hand-down maps to AI/BI: a journey toward Databricks" + }, + { + "fullname": "Andrea Calegari", + "type": "Talk", + "title": "From hand-down maps to AI/BI: a journey toward Databricks" + }, + { + "fullname": "Florian Stefan", + "type": "Talk", + "title": "Accelerating privacy-enhancing data processing" + }, + { + "fullname": "Patrick Deutschmann", + "type": "Talk", + "title": "Hello Bug, My Old Friend" + }, + { + "fullname": "Jorge Martinez Gomez", + "type": "Talk", + "title": "Understanding geospatial data with duckdb" + }, + { + "fullname": "Adrin Jalali", + "type": "Talk", + "title": "Writing a scikit-learn compatible estimator in the modern age" + }, + { + "fullname": "Jessica Greene", + "type": "Training", + "title": "Monitoring carbon emissions: making the impact of your Python code visible" + }, + { + "fullname": "Tereza Iofciu", + "type": "Training", + "title": "Monitoring carbon emissions: making the impact of your Python code visible" + }, + { + "fullname": "Giovanni Pedroncelli ", + "type": "Training", + "title": "Python e Cybersecurity: Caccia alle vulnerabilità" + }, + { + "fullname": "Andrea Pastelli", + "type": "Training", + "title": "Zero to Deployed: Create Your First App with Streamlit" + }, + { + "fullname": "Attila Toth", + "type": "Talk", + "title": "Building real-time apps for web, mobile & desktop in Python" + }, + { + "fullname": "Alex Casalboni", + "type": "Talk", + "title": "From Cloud to Edge computing - Unleashing the power of WebAssembly at the edge" + }, + { + "fullname": "Tommaso Radicioni", + "type": "Talk", + "title": "Come migliorare la tua applicazione basata su LLM? Haystack, Llamaindex e LangChain a confronto" + }, + { + "fullname": "Aivars Kalvāns", + "type": "Talk", + "title": "QuerySet.explain(): make it make sense." + }, + { + "fullname": "Cristián Maureira-Fredes", + "type": "Talk", + "title": "Understanding Python from the inside: C concepts to dive into CPython fearless" + }, + { + "fullname": "Luca Baggi", + "type": "Talk", + "title": "Foundational Models for Time Series Forecasting: are we there yet?" + }, + { + "fullname": "Konrad Gawda", + "type": "Talk", + "title": "Bytecode and .pyc files" + }, + { + "fullname": "Lorenzo Bisi", + "type": "Talk", + "title": "Prevenire l'Obsolescenza dei Modelli ML: Il Caso Bioretics" + }, + { + "fullname": "Lavelli", + "type": "Talk", + "title": "Prevenire l'Obsolescenza dei Modelli ML: Il Caso Bioretics" + }, + { + "fullname": "Giovanni Giacometti", + "type": "Talk", + "title": "Prevenire l'Obsolescenza dei Modelli ML: Il Caso Bioretics" + }, + { + "fullname": "Nicola Guglielmi", + "type": "Talk", + "title": "Beyond Solo: Enhancing LLMs through Collaborative Dialogue with GAN-Inspired Approaches" + }, + { + "fullname": "Rodrigo Girão Serrão", + "type": "Talk", + "title": "Dipping my toes in metaprogramming" + }, + { + "fullname": "Iacopo Spalletti", + "type": "Talk", + "title": "Django dalle trincee: pattern e pratiche dopo 15 anni di esperienza su Django" + }, + { + "fullname": "Sarah Abderemane", + "type": "Keynote", + "title": "Accessibility awareness" + }, + { + "fullname": "Nicholas Tollervey", + "type": "Keynote", + "title": "Creative Compassionate Code (if Python isn't fun, we're doing it wrong)" + }, + { + "fullname": "Riccardo Magliocchetti", + "type": "Talk", + "title": "Observing Python applications with OpenTelemetry" + }, + { + "fullname": "Sebastián Ramírez", + "type": "Talk", + "title": "Deploy FastAPI to the cloud" + }, + { + "fullname": "Loïc Estève", + "type": "Talk", + "title": "PyPI in the face: running jokes that PyPI download stats can play on you" + }, + { + "fullname": "Navid Nobani", + "type": "Talk", + "title": "Private Generative Models: Balancing Privacy and Utility in AI" + }, + { + "fullname": "Domenico Nucera", + "type": "Talk", + "title": "Practical Python parsing with the ast standard module" + }, + { + "fullname": "Daniel Hervás", + "type": "Talk", + "title": "Python Containers: Best Practices" + }, + { + "fullname": "Roberto Polli", + "type": "Training", + "title": "Knowledge management 101" + }, + { + "fullname": "Oleh Kostromin", + "type": "Training", + "title": "What's inside the box? Building a deep learning framework from scratch." + }, + { + "fullname": "Sheena", + "type": "Talk", + "title": "So you want a modern frontend for your Python web app?" + }, + { + "fullname": "ChiaraCielo Longobardi", + "type": "Talk", + "title": "Get Accessibility Right: Shift It Left!" + }, + { + "fullname": "Thiago Bellini Ribeiro", + "type": "Talk", + "title": "Typing your Python code like a ninja!" + }, + { + "fullname": "Arthur Pastel", + "type": "Talk", + "title": "Intuition vs. Reality: Surprising Truths in Python Performance" + }, + { + "fullname": "Adrien Cacciaguerra", + "type": "Talk", + "title": "Intuition vs. Reality: Surprising Truths in Python Performance" + }, + { + "fullname": "Vinícius Gubiani Ferreira", + "type": "Talk", + "title": "uv without sunblock: faster than ever dependency and project management" + }, + { + "fullname": "Alessandra Bilardi", + "type": "Talk", + "title": "The Art of Data Visualization" + }, + { + "fullname": "Lovisa", + "type": "Talk", + "title": "A love letter to messaging: Celebrating RabbitMQ's journey" + }, + { + "fullname": "Ilyas Timour", + "type": "Talk", + "title": "Autonomous driving, how Python drives Formula Racing cars" + }, + { + "fullname": "Rodrigo Girão Serrão", + "type": "Talk", + "title": "A tour of the module itertools" + }, + { + "fullname": "Tanu Batra", + "type": "Talk", + "title": "Demystifying Design Patterns: A Practical Guide for Developers" + }, + { + "fullname": "Gianluca Romanin", + "type": "Talk", + "title": "Backend-First: Revolutionizing Front-End Development with Django and HTMX" + }, + { + "fullname": "Giovanni Barillari", + "type": "Talk", + "title": "RLoop: an AsyncIO event loop implemented in Rust" + }, + { + "fullname": "Luca Di Vita", + "type": "Talk", + "title": "Cifrari Fantastici E Come Violarli" + }, + { + "fullname": "Luca Gilli", + "type": "Talk", + "title": "How to build your own Tiny Language Model from scratch" + }, + { + "fullname": "Maxim Danilov", + "type": "Talk", + "title": "Distributing complexity in huge python projects." + }, + { + "fullname": "Luca Corbucci", + "type": "Talk", + "title": "Learning Together, Distributed: An Introduction to Federated Learning" + }, + { + "fullname": "Jan Giacomelli", + "type": "Talk", + "title": "Efficient FastAPI testing with pytest, dependency injection and snapshots" + }, + { + "fullname": "Lisa Di Marco", + "type": "Talk", + "title": "Come imparare Python da 0 con un approccio evidence-based" + }, + { + "fullname": "Giuseppe Birardi", + "type": "Talk", + "title": "AI Intuition: Exploring Language Model Latent Space" + }, + { + "fullname": "Sebastiaan Zeeff", + "type": "Talk", + "title": "Don't Panic! A Developer's Guide To Security" + }, + { + "fullname": "Stanislav Zmiev", + "type": "Talk", + "title": "They are not unit tests: a survey of unit-testing anti-patterns" + }, + { + "fullname": "Rami Awar", + "type": "Talk", + "title": "Exploring Functional Options in Python" + }, + { + "fullname": "Jonathan Marcel Ehwald", + "type": "Talk", + "title": "Strawberry Fields Forever: Enjoy building GraphQL Web APIs" + }, + { + "fullname": "Sofie Van Landeghem", + "type": "Keynote", + "title": "Data doesn't lie — but it can mislead: How to ensure integrity of your Machine Learning applications" + } + ] +} \ No newline at end of file diff --git a/scripts/pyconitalia.py b/scripts/pyconitalia.py index 73d2180..6f3657c 100644 --- a/scripts/pyconitalia.py +++ b/scripts/pyconitalia.py @@ -73,6 +73,35 @@ def get_pycon_sponsors(conference_code: str) -> GraphQLResponse: return fetch_graphql_data(query, variables) +def get_pycon_speakers(conference_code: str) -> GraphQLResponse: + """ + Fetch speakers data from PyCon Italia GraphQL API. + """ + + query = """ + query GetSpeakers($code: String!) { + conference(code: $code) { + start + days { + slots { + items { + title + speakers { + fullName + } + type + } + } + } + } + } + """ + + variables = {"code": conference_code} + + return fetch_graphql_data(query, variables) + + class Sponsor(TypedDict): name: str website: str @@ -85,6 +114,17 @@ class SponsorsData(TypedDict): sponsors: list[Sponsor] +class Speaker(TypedDict): + fullname: str + type: str + title: str + + +class SpeakersData(TypedDict): + year: int + speakers: list[Speaker] + + def format_sponsors_data(raw_data: GraphQLResponse) -> SponsorsData: """ Format the raw GraphQL response into a structured format. @@ -126,7 +166,52 @@ def format_sponsors_data(raw_data: GraphQLResponse) -> SponsorsData: return {"year": year, "levels": levels_dict, "sponsors": sponsors_list} -def save_to_json(data: SponsorsData, output_file: Path) -> None: +def format_speakers_data(raw_data: GraphQLResponse) -> SpeakersData: + """ + Format the raw GraphQL response into a structured speakers format. + """ + if "errors" in raw_data and raw_data["errors"]: + raise ValueError(f"GraphQL errors: {raw_data['errors']}") + + conference_data = raw_data["data"]["conference"] + days = conference_data["days"] + start_date = conference_data["start"] + + # Create speakers list + speakers_list: list[Speaker] = [] + + # Track processed items to avoid duplicates + + # Extract year from start date + year = int(start_date.split("-")[0]) + + for day in days: + for slot in day["slots"]: + for item in slot["items"]: + # Only process training, talk, and keynote items + if item["type"] not in ["training", "talk", "keynote"]: + continue + + title = item["title"] + item_type = item["type"] + speakers = item["speakers"] + + # If no speakers, skip this item + if not speakers: + continue + + # Add one entry per speaker + for speaker in speakers: + speakers_list.append({ + "fullname": speaker["fullName"], + "type": item_type.title(), # Capitalize first letter + "title": title + }) + + return {"year": year, "speakers": speakers_list} + + +def save_to_json(data: SponsorsData | SpeakersData, output_file: Path) -> None: """ Save data to a JSON file. """ @@ -141,42 +226,33 @@ def save_to_json(data: SponsorsData, output_file: Path) -> None: def main(): parser = argparse.ArgumentParser( - description="Fetch sponsors data from PyCon Italia GraphQL API" + description="Fetch data from PyCon Italia GraphQL API" ) parser.add_argument( "--conference-code", required=True, help="Conference code (e.g., pycon12)" ) - parser.add_argument( - "--output", - type=Path, - help=( - "Output JSON file path (optional, defaults to " - "data/sponsors/PyConIt/{year}.json)" - ), - ) - args = parser.parse_args() - logger.info("Fetching sponsors data for conference: %s", args.conference_code) + logger.info( + "Fetching data for conference: %s", args.conference_code + ) + + raw_data = get_pycon_speakers(args.conference_code) + formatted_data = format_speakers_data(raw_data) + output_path = Path("data/speakers/PyConItalia") / f"{formatted_data['year']}.json" + output_path.parent.mkdir(parents=True, exist_ok=True) + save_to_json(formatted_data, output_path) - # Fetch raw data from GraphQL API raw_data = get_pycon_sponsors(args.conference_code) + formatted_data = format_sponsors_data(raw_data) + output_path = Path("data/sponsors/PyConItalia") / f"{formatted_data['year']}.json" + output_path.parent.mkdir(parents=True, exist_ok=True) + save_to_json(formatted_data, output_path) if not raw_data: logger.error("No data received from the API") sys.exit(1) - - # Format the data - formatted_data = format_sponsors_data(raw_data) - - # Output or save data - output_path = ( - args.output - if args.output - else (Path("data/sponsors/PyConItalia") / f"{formatted_data['year']}.json") - ) - output_path.parent.mkdir(parents=True, exist_ok=True) - save_to_json(formatted_data, output_path) + if __name__ == "__main__":