├── .nojekyll ├── CNAME ├── utils ├── requirements.txt ├── main.py ├── schema.yml ├── date_magic.py ├── utils.py ├── sort_yaml.py └── import_python_organizers.py ├── robots.txt ├── ads.txt ├── static ├── img │ ├── favicon.png │ ├── calendar.png │ ├── pythondeadlines-edit.gif │ ├── 072-location.svg │ ├── 084-calendar.svg │ ├── 035-file-text.svg │ ├── 060-coin-dollar.svg │ ├── 269-info.svg │ ├── 407-mastodon.svg │ ├── 033-books.svg │ ├── 407-twitter.svg │ ├── 066-lifebuoy.svg │ └── 203-earth.svg ├── fonts │ ├── KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2 │ ├── KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2 │ ├── KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2 │ ├── KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2 │ ├── KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2 │ ├── KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2 │ ├── KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2 │ ├── KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2 │ ├── KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ.woff2 │ ├── KFOlCnqEu92Fr1MmWUlfBBc4AMP6lQ.woff2 │ ├── KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2 │ ├── KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.woff2 │ ├── KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2 │ ├── KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2 │ ├── KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2 │ ├── KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.woff2 │ ├── KFOlCnqEu92Fr1MmSU5fABc4AMP6lbBP.woff2 │ ├── KFOlCnqEu92Fr1MmSU5fBxc4AMP6lbBP.woff2 │ ├── KFOlCnqEu92Fr1MmSU5fCBc4AMP6lbBP.woff2 │ ├── KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP.woff2 │ ├── KFOlCnqEu92Fr1MmSU5fChc4AMP6lbBP.woff2 │ ├── KFOlCnqEu92Fr1MmSU5fCxc4AMP6lbBP.woff2 │ ├── KFOlCnqEu92Fr1MmWUlfABc4AMP6lbBP.woff2 │ ├── KFOlCnqEu92Fr1MmWUlfBxc4AMP6lbBP.woff2 │ ├── KFOlCnqEu92Fr1MmWUlfCBc4AMP6lbBP.woff2 │ ├── KFOlCnqEu92Fr1MmWUlfCRc4AMP6lbBP.woff2 │ ├── KFOlCnqEu92Fr1MmWUlfChc4AMP6lbBP.woff2 │ └── KFOlCnqEu92Fr1MmWUlfCxc4AMP6lbBP.woff2 ├── css │ ├── calendar.css │ ├── mastodon.css │ ├── js-year-calendar.min.css │ └── deadlines.css ├── xml │ ├── rss.xsl │ └── rss-description.xsl └── js │ ├── store.min.js │ ├── jquery.countdown.min.js │ └── ouical.min.js ├── LICENSE ├── README.md ├── 404.html ├── python-deadlines.ics ├── sitemap.xml ├── feed.xml ├── resources ├── what-about │ └── index.html ├── what-are-python-cfps │ └── index.html ├── good-conference-talk-proposals │ └── index.html ├── how-to-get-started-talk-python-conferences │ └── index.html └── common-pitfalls │ └── index.html └── conference ├── index.html └── pyjamas-conf-2023 └── index.html /.nojekyll: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | pythondeadlin.es -------------------------------------------------------------------------------- /utils/requirements.txt: -------------------------------------------------------------------------------- 1 | pandas 2 | fuzzyfuzzy -------------------------------------------------------------------------------- /robots.txt: -------------------------------------------------------------------------------- 1 | Sitemap: https://pythondeadlin.es/sitemap.xml 2 | -------------------------------------------------------------------------------- /ads.txt: -------------------------------------------------------------------------------- 1 | google.com, pub-2158291969836277, DIRECT, f08c47fec0942fa0 -------------------------------------------------------------------------------- /static/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/img/favicon.png -------------------------------------------------------------------------------- /static/img/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/img/calendar.png -------------------------------------------------------------------------------- /static/img/pythondeadlines-edit.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/img/pythondeadlines-edit.gif -------------------------------------------------------------------------------- /static/fonts/KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOmCnqEu92Fr1Mu4WxKKTU1Kvnz.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOmCnqEu92Fr1Mu4mxKKTU1Kg.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOmCnqEu92Fr1Mu5mxKKTU1Kvnz.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOmCnqEu92Fr1Mu7GxKKTU1Kvnz.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOmCnqEu92Fr1Mu7WxKKTU1Kvnz.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmEU9fBBc4AMP6lQ.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmSU5fBBc4AMP6lQ.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmWUlfBBc4AMP6lQ.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmWUlfBBc4AMP6lQ.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmEU9fABc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmEU9fBxc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmEU9fCBc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmEU9fCRc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmEU9fChc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmEU9fCxc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmSU5fABc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmSU5fABc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmSU5fBxc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmSU5fBxc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmSU5fCBc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmSU5fCBc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmSU5fCRc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmSU5fChc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmSU5fChc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmSU5fCxc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmSU5fCxc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmWUlfABc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmWUlfABc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmWUlfBxc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmWUlfBxc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmWUlfCBc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmWUlfCBc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmWUlfCRc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmWUlfCRc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmWUlfChc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmWUlfChc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /static/fonts/KFOlCnqEu92Fr1MmWUlfCxc4AMP6lbBP.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/john-sandall/python-deadlines/gh-pages/static/fonts/KFOlCnqEu92Fr1MmWUlfCxc4AMP6lbBP.woff2 -------------------------------------------------------------------------------- /utils/main.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | sys.path.append(".") 4 | from sort_yaml import sort_data 5 | from import_python_organizers import main as updater 6 | 7 | if __name__ == "__main__": 8 | updater() 9 | sort_data() -------------------------------------------------------------------------------- /static/css/calendar.css: -------------------------------------------------------------------------------- 1 | .color-box { 2 | width: 16px; 3 | height: 16px; 4 | display: inline-block; 5 | background-color: #ccc; 6 | border-radius: 5px; 7 | } 8 | 9 | .deadline-text { 10 | text-decoration: underline; 11 | text-decoration-color: red; 12 | } 13 | 14 | @media only screen and (max-width: 550px) { 15 | #calendar-page { 16 | display: inline; 17 | } 18 | 19 | } -------------------------------------------------------------------------------- /static/css/mastodon.css: -------------------------------------------------------------------------------- 1 | #mastodon-feed { 2 | font-family: Arial, sans-serif; 3 | } 4 | 5 | .timeline-item { 6 | position: relative; 7 | padding-left: 30px; 8 | margin-bottom: 20px; 9 | } 10 | 11 | .timeline-content { 12 | margin-left: 15px; 13 | } 14 | 15 | .timeline-content a { 16 | color: #343434; 17 | text-decoration: none; 18 | border-bottom: 0 !important; 19 | } 20 | 21 | .timeline-content a:hover { 22 | text-decoration: underline; 23 | } -------------------------------------------------------------------------------- /static/img/072-location.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /static/img/084-calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /static/img/035-file-text.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /static/img/060-coin-dollar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /static/img/269-info.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /static/img/407-mastodon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/img/033-books.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /static/img/407-twitter.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /static/img/066-lifebuoy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /static/img/203-earth.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Abhishek Das 4 | 5 | Modifications by 6 | Copyright (c) 2022 Jesper Dramsch 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in all 16 | copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24 | SOFTWARE. 25 | -------------------------------------------------------------------------------- /utils/schema.yml: -------------------------------------------------------------------------------- 1 | - title: BestConf # Title of conference without year 2 | year: 2022 # Year 3 | link: link-to-website.com # URL to conference 4 | cfp_link: link-to-cfp.com # URL to call for proposals (Optional) 5 | cfp: 'YYYY-MM-DD HH:mm:ss' # Deadline for Call for Participation / Proposals 6 | workshop_deadline: 'YYYY-MM-DD HH:mm:ss' # Workshop deadline if different from cfp (Optional) 7 | tutorial_deadline: 'YYYY-MM-DD HH:mm:ss' # Tutorial deadline if different from cfp (Optional) 8 | timezone: Asia/Seoul # Standard IANA Timezones (Omit for AoE) 9 | place: Incheon, South Korea # City, Country 10 | date: September 18 - 22, 2022 # Nicely written dates of conference 11 | start: YYYY-MM-DD # Start date of conference for calendar 12 | end: YYYY-MM-DD # End date of conference for calendar 13 | sponsor: link-to-sponsor.page # URL to Sponsorship page (Optional) 14 | finaid: link-to-finaid.page # URL to Financial Aid page (Optional) 15 | twitter: BestConfEver # Twitter handle of conference (Optional) 16 | mastodon: https://mastodon.social/@bconf # Mastodon handle of conference (Optional) 17 | sub: PY # Type of conference (see or add _data/types.yml) 18 | note: Important # In case there are extra notes about the conference (Optional) 19 | location: # Geolocation for inclusion in map 20 | latitude: 0.00 21 | longitude: 0.00 -------------------------------------------------------------------------------- /static/xml/rss.xsl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <xsl:value-of select="rss/channel/title"/> (RSS) 10 | 11 | 12 | 13 |

(RSS)

14 |

This is an RSS feed. To subscribe to it, copy its address and paste it when your feed reader asks for it. It will be updated periodically in your reader. New to feeds? Learn more.

15 |

16 | 17 | 18 |

19 |

Preview of the feed’s current headlines:

20 |
    21 | 22 |
  1. 23 |
    24 |
25 | 26 | 27 |
28 |
29 | -------------------------------------------------------------------------------- /static/xml/rss-description.xsl: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <xsl:value-of select="rss/channel/title"/> (RSS) 10 | 11 | 12 | 13 |

(RSS)

14 |

This is an RSS feed. To subscribe to it, copy its address and paste it when your feed reader asks for it. It will be updated periodically in your reader. New to feeds? Learn more.

15 |

16 | 17 | 18 |

19 |

Preview of the feed’s current headlines:

20 |
    21 | 22 |
  1. 23 |
    24 |
25 | 26 | 27 |
28 |
29 | -------------------------------------------------------------------------------- /utils/date_magic.py: -------------------------------------------------------------------------------- 1 | 2 | import datetime 3 | 4 | 5 | dateformat = "%Y-%m-%d %H:%M:%S" 6 | tba_words = ["tba", "tbd"] 7 | 8 | 9 | def clean_dates(data): 10 | 11 | # Clean Up Dates 12 | for dates in ["start", "end"]: 13 | if isinstance(data[dates], str): 14 | data[dates] = datetime.datetime.strptime(data[dates], dateformat.split(" ")[0]).date() 15 | 16 | # Make deadlines 17 | for datetimes in ["cfp", "workshop_deadline", "tutorial_deadline"]: 18 | if datetimes in data and data[datetimes].lower() not in tba_words: 19 | try: 20 | tmp_time = datetime.datetime.strptime(data[datetimes], dateformat.split(" ")[0]) 21 | if tmp_time.hour == 0 and tmp_time.minute == 0: 22 | tmp_time += datetime.timedelta(hours=23, minutes=59) 23 | data[datetimes] = tmp_time.strftime(dateformat) 24 | except ValueError: 25 | continue 26 | 27 | return data 28 | 29 | def suffix(d): 30 | return 'th' if 11<=d<=13 else {1:'st',2:'nd',3:'rd'}.get(d%10, 'th') 31 | 32 | 33 | def create_nice_date(data): 34 | if "date" in data and data["date"]: 35 | return data 36 | 37 | try: 38 | start = datetime.datetime.strptime(data["start"], dateformat.split(" ")[0]) 39 | end = datetime.datetime.strptime(data["end"], dateformat.split(" ")[0]) 40 | except TypeError: 41 | start = data["start"] 42 | end = data["end"] 43 | 44 | if start == end: 45 | tmp_date = start.strftime("%B %d, %Y") 46 | 47 | data["date"] = tmp_date[:-6] + suffix(start.day) + tmp_date[-6:] 48 | elif start.month == end.month: 49 | tmp_date = start.strftime("%B %d, %Y") 50 | 51 | data["date"] = tmp_date[:-6] + " - " + end.strftime("%d") + tmp_date[-6:] 52 | elif start.year == end.year: 53 | tmp_date = start.strftime("%B %d, %Y") 54 | data["date"] = tmp_date[:-6] + " - " + end.strftime("%B %d") + tmp_date[-6:] 55 | else: 56 | data["date"] = start.strftime("%B %d, %Y") + " - " + end.strftime("%B %d, %Y") 57 | 58 | return data 59 | 60 | 61 | -------------------------------------------------------------------------------- /utils/utils.py: -------------------------------------------------------------------------------- 1 | import yaml 2 | import pandas as pd 3 | import sys 4 | 5 | try: 6 | from yaml import CDumper as Dumper 7 | from yaml import CLoader as Loader 8 | except ImportError: 9 | from yaml import Loader, Dumper 10 | 11 | from yaml.representer import SafeRepresenter 12 | 13 | _mapping_tag = yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG 14 | 15 | 16 | def dict_representer(dumper, data): 17 | return dumper.represent_dict(data.iteritems()) 18 | 19 | 20 | def dict_constructor(loader, node): 21 | return dict(loader.construct_pairs(node)) 22 | 23 | 24 | Dumper.add_representer(dict, dict_representer) 25 | Loader.add_constructor(_mapping_tag, dict_constructor) 26 | 27 | Dumper.add_representer(str, SafeRepresenter.represent_str) 28 | 29 | 30 | def ordered_dump(data, stream=None, Dumper=yaml.Dumper, **kwds): 31 | class OrderedDumper(Dumper): 32 | pass 33 | 34 | def _dict_representer(dumper, data): 35 | return dumper.represent_mapping( 36 | yaml.resolver.BaseResolver.DEFAULT_MAPPING_TAG, data.items() 37 | ) 38 | 39 | OrderedDumper.add_representer(dict, _dict_representer) 40 | return yaml.dump(data, stream, OrderedDumper, **kwds) 41 | 42 | 43 | def pretty_print(header, conf, tba=None, expired=None): 44 | """Print order of conferences 45 | 46 | Args: 47 | header (_type_): Header for print 48 | conf (_type_): conferences 49 | tba (_type_, optional): tba conferences. Defaults to None. 50 | expired (_type_, optional): expired conferences. Defaults to None. 51 | """ 52 | print(header) 53 | for data in [conf, tba, expired]: 54 | if data is not None: 55 | for q in data: 56 | print(q["cfp"], " - ", q["title"]) 57 | print("\n") 58 | 59 | 60 | def get_schema(): 61 | with open("utils/schema.yml", "r") as file: 62 | data = yaml.load(file, Loader=yaml.FullLoader) 63 | 64 | # Convert the YAML data to a Pandas DataFrame 65 | return pd.DataFrame.from_dict(data).drop(index=0) 66 | 67 | 68 | # Helper function for yes no questions 69 | def query_yes_no(question, default="no"): 70 | """Ask a yes/no question via input() and return their answer. 71 | 72 | "question" is a string that is presented to the user. 73 | "default" is the presumed answer if the user just hits . 74 | It must be "yes" (the default), "no" or None (meaning 75 | an answer is required of the user). 76 | 77 | The "answer" return value is True for "yes" or False for "no". 78 | """ 79 | valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False} 80 | if default is None: 81 | prompt = " [y/n] " 82 | elif default == "yes": 83 | prompt = " [Y/n] " 84 | elif default == "no": 85 | prompt = " [y/N] " 86 | else: 87 | raise ValueError("invalid default answer: '%s'" % default) 88 | 89 | while True: 90 | sys.stdout.write(question + prompt) 91 | choice = input().lower() 92 | if default is not None and choice == "": 93 | return valid[default] 94 | elif choice in valid: 95 | return valid[choice] 96 | else: 97 | sys.stdout.write("Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n") 98 | -------------------------------------------------------------------------------- /static/js/store.min.js: -------------------------------------------------------------------------------- 1 | /* Copyright (c) 2010-2016 Marcus Westin */ 2 | (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.store = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;odocument.w=window'),u.close(),c=u.w.frames[0].document,t=c.createElement("div")}catch(l){t=i.createElement("div"),c=i.body}var f=function(e){return function(){var n=Array.prototype.slice.call(arguments,0);n.unshift(t),c.appendChild(t),t.addBehavior("#default#userData"),t.load(o);var i=e.apply(r,n);return c.removeChild(t),i}},d=new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]","g"),s=function(e){return e.replace(/^d/,"___$&").replace(d,"___")};r.set=f(function(e,t,n){return t=s(t),void 0===n?r.remove(t):(e.setAttribute(t,r.serialize(n)),e.save(o),n)}),r.get=f(function(e,t,n){t=s(t);var i=r.deserialize(e.getAttribute(t));return void 0===i?n:i}),r.remove=f(function(e,t){t=s(t),e.removeAttribute(t),e.save(o)}),r.clear=f(function(e){var t=e.XMLDocument.documentElement.attributes;e.load(o);for(var r=t.length-1;r>=0;r--)e.removeAttribute(t[r].name);e.save(o)}),r.getAll=function(e){var t={};return r.forEach(function(e,r){t[e]=r}),t},r.forEach=f(function(e,t){for(var n,i=e.XMLDocument.documentElement.attributes,o=0;n=i[o];++o)t(n.name,r.deserialize(e.getAttribute(n.name)))})}try{var v="__storejs__";r.set(v,v),r.get(v)!=v&&(r.disabled=!0),r.remove(v)}catch(l){r.disabled=!0}return r.enabled=!r.disabled,r}(); 5 | }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) 6 | },{}]},{},[1])(1) 7 | }); -------------------------------------------------------------------------------- /static/js/jquery.countdown.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * The Final Countdown for jQuery v2.2.0 (http://hilios.github.io/jQuery.countdown/) 3 | * Copyright (c) 2016 Edson Hilios 4 | * 5 | * Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | * this software and associated documentation files (the "Software"), to deal in 7 | * the Software without restriction, including without limitation the rights to 8 | * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | * the Software, and to permit persons to whom the Software is furnished to do so, 10 | * subject to the following conditions: 11 | * 12 | * The above copyright notice and this permission notice shall be included in all 13 | * copies or substantial portions of the Software. 14 | * 15 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | */ 22 | !function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):a(jQuery)}(function(a){"use strict";function b(a){if(a instanceof Date)return a;if(String(a).match(g))return String(a).match(/^[0-9]*$/)&&(a=Number(a)),String(a).match(/\-/)&&(a=String(a).replace(/\-/g,"/")),new Date(a);throw new Error("Couldn't cast `"+a+"` to a date object.")}function c(a){var b=a.toString().replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1");return new RegExp(b)}function d(a){return function(b){var d=b.match(/%(-|!)?[A-Z]{1}(:[^;]+;)?/gi);if(d)for(var f=0,g=d.length;f1?c:d}var f=[],g=[],h={precision:100,elapse:!1,defer:!1};g.push(/^[0-9]*$/.source),g.push(/([0-9]{1,2}\/){2}[0-9]{4}( [0-9]{1,2}(:[0-9]{2}){2})?/.source),g.push(/[0-9]{4}([\/\-][0-9]{1,2}){2}( [0-9]{1,2}(:[0-9]{2}){2})?/.source),g=new RegExp(g.join("|"));var i={Y:"years",m:"months",n:"daysToMonth",d:"daysToWeek",w:"weeks",W:"weeksToMonth",H:"hours",M:"minutes",S:"seconds",D:"totalDays",I:"totalHours",N:"totalMinutes",T:"totalSeconds"},j=function(b,c,d){this.el=b,this.$el=a(b),this.interval=null,this.offset={},this.options=a.extend({},h),this.instanceNumber=f.length,f.push(this),this.$el.data("countdown-instance",this.instanceNumber),d&&("function"==typeof d?(this.$el.on("update.countdown",d),this.$el.on("stoped.countdown",d),this.$el.on("finish.countdown",d)):this.options=a.extend({},h,d)),this.setFinalDate(c),this.options.defer===!1&&this.start()};a.extend(j.prototype,{start:function(){null!==this.interval&&clearInterval(this.interval);var a=this;this.update(),this.interval=setInterval(function(){a.update.call(a)},this.options.precision)},stop:function(){clearInterval(this.interval),this.interval=null,this.dispatchEvent("stoped")},toggle:function(){this.interval?this.stop():this.start()},pause:function(){this.stop()},resume:function(){this.start()},remove:function(){this.stop.call(this),f[this.instanceNumber]=null,delete this.$el.data().countdownInstance},setFinalDate:function(a){this.finalDate=b(a)},update:function(){if(0===this.$el.closest("html").length)return void this.remove();var b,c=void 0!==a._data(this.el,"events"),d=new Date;b=this.finalDate.getTime()-d.getTime(),b=Math.ceil(b/1e3),b=!this.options.elapse&&b<0?0:Math.abs(b),this.totalSecsLeft!==b&&c&&(this.totalSecsLeft=b,this.elapsed=d>=this.finalDate,this.offset={seconds:this.totalSecsLeft%60,minutes:Math.floor(this.totalSecsLeft/60)%60,hours:Math.floor(this.totalSecsLeft/60/60)%24,days:Math.floor(this.totalSecsLeft/60/60/24)%7,daysToWeek:Math.floor(this.totalSecsLeft/60/60/24)%7,daysToMonth:Math.floor(this.totalSecsLeft/60/60/24%30.4368),weeks:Math.floor(this.totalSecsLeft/60/60/24/7),weeksToMonth:Math.floor(this.totalSecsLeft/60/60/24/7)%4,months:Math.floor(this.totalSecsLeft/60/60/24/30.4368),years:Math.abs(this.finalDate.getFullYear()-d.getFullYear()),totalDays:Math.floor(this.totalSecsLeft/60/60/24),totalHours:Math.floor(this.totalSecsLeft/60/60),totalMinutes:Math.floor(this.totalSecsLeft/60),totalSeconds:this.totalSecsLeft},this.options.elapse||0!==this.totalSecsLeft?this.dispatchEvent("update"):(this.stop(),this.dispatchEvent("finish")))},dispatchEvent:function(b){var c=a.Event(b+".countdown");c.finalDate=this.finalDate,c.elapsed=this.elapsed,c.offset=a.extend({},this.offset),c.strftime=d(this.offset),this.$el.trigger(c)}}),a.fn.countdown=function(){var b=Array.prototype.slice.call(arguments,0);return this.each(function(){var c=a(this).data("countdown-instance");if(void 0!==c){var d=f[c],e=b[0];j.prototype.hasOwnProperty(e)?d[e].apply(d,b.slice(1)):null===String(e).match(/^[$A-Z_][0-9A-Z_$]*$/i)?(d.setFinalDate.call(d,e),d.start()):a.error("Method %s does not exist on jQuery.countdown".replace(/\%s/gi,e))}else new j(this,b[0],b[1])})}}); -------------------------------------------------------------------------------- /static/css/js-year-calendar.min.css: -------------------------------------------------------------------------------- 1 | .calendar{padding:4px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;direction:ltr;overflow-x:hidden;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.calendar:after{clear:both;content:"";display:block}.calendar .calendar-rtl{direction:rtl}.calendar .calendar-rtl .calendar-rtl table tr td span{float:right}.calendar table{margin:auto;border-spacing:0}.calendar table td,.calendar table th{text-align:center;width:20px;height:20px;border:none;padding:4px 5px;font-size:12px}.calendar .calendar-header{width:100%;margin-bottom:20px;border:1px solid #ddd}.calendar .calendar-header table{width:100%}.calendar .calendar-header table th{font-size:22px;padding:5px 10px;cursor:pointer}.calendar .calendar-header table th:hover{background:#eee}.calendar .calendar-header table th.disabled,.calendar .calendar-header table th.disabled:hover{background:0 0;cursor:default;color:#fff}.calendar .calendar-header table th.next,.calendar .calendar-header table th.prev{width:20px}.calendar .calendar-header .year-title{font-weight:700;text-align:center;height:20px;width:auto}.calendar .calendar-header .year-neighbor{opacity:.4}@media (max-width:991px){.calendar .calendar-header .year-neighbor{display:none}}.calendar .calendar-header .year-neighbor2{opacity:.2}@media (max-width:767px){.calendar .calendar-header .year-neighbor2{display:none}}.calendar .months-container{width:100%;display:none;flex-wrap:wrap}.calendar .months-container .month-container{float:left;text-align:center;padding:0}.calendar .months-container .month-container.month-2{width:16.66666667%}.calendar .months-container .month-container.month-3{width:25%}.calendar .months-container .month-container.month-4{width:33.33333333%}.calendar .months-container .month-container.month-6{width:50%}.calendar .months-container .month-container.month-12{width:100%}.calendar table.month th.month-title{font-size:16px;padding-bottom:5px}.calendar table.month th.day-header{font-size:14px}.calendar table.month tr td,.calendar table.month tr th{padding:0}.calendar table.month tr td.hidden,.calendar table.month tr th.hidden{display:none}.calendar table.month td.week-number{cursor:default;font-weight:700;border-right:1px solid #eee;padding:5px}.calendar table.month td.day.round-left{-webkit-border-radius:8px 0 0 8px;-moz-border-radius:8px 0 0 8px;border-radius:8px 0 0 8px}.calendar table.month td.day.round-right{webkit-border-radius:0 8px 8px 0;-moz-border-radius:0 8px 8px 0;border-radius:0 8px 8px 0}.calendar table.month td.day .day-content{-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;padding:5px 6px}.calendar table.month td.new,.calendar table.month td.new:hover,.calendar table.month td.old,.calendar table.month td.old:hover{background:0 0;cursor:default}.calendar table.month td.disabled,.calendar table.month td.disabled:hover{color:#ddd}.calendar table.month td.disabled .day-content:hover,.calendar table.month td.disabled:hover .day-content:hover{background:0 0;cursor:default}.calendar table.month td.range .day-content{background:rgba(0,0,0,.2);-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.calendar table.month td.range.range-start .day-content{border-top-left-radius:4px;border-bottom-left-radius:4px}.calendar table.month td.range.range-end .day-content{border-top-right-radius:4px;border-bottom-right-radius:4px}.calendar .calendar-loading-container{position:relative;text-align:center;min-height:200px}.calendar .calendar-loading-container .calendar-loading{position:absolute;top:50%;left:50%;transform:translateX(-50%) translateY(-50%)}.calendar .calendar-spinner{margin:20px auto;width:80px;text-align:center}.calendar .calendar-spinner>div{width:16px;height:16px;margin:5px;background-color:#333;border-radius:100%;display:inline-block;-webkit-animation:sk-bouncedelay 1s infinite ease-in-out both;animation:sk-bouncedelay 1s infinite ease-in-out both}.calendar .calendar-spinner>div.bounce1{-webkit-animation-delay:-.32s;animation-delay:-.32s}.calendar .calendar-spinner>div.bounce2{-webkit-animation-delay:-.16s;animation-delay:-.16s}.calendar-context-menu,.calendar-context-menu .submenu{border:1px solid #ddd;background-color:#fff;box-shadow:2px 2px 5px rgba(0,0,0,.2);-webkit-box-shadow:2px 2px 5px rgba(0,0,0,.2);position:absolute;display:none}.calendar-context-menu .item{position:relative}.calendar-context-menu .item .content{padding:5px 10px;cursor:pointer;display:table;width:100%;white-space:nowrap;box-sizing:border-box}.calendar-context-menu .item .content:hover{background:#eee}.calendar-context-menu .item .content .text{display:table-cell}.calendar-context-menu .item .content .arrow{display:table-cell;padding-left:10px;text-align:right}.calendar-context-menu .item .submenu{top:-1px}.calendar-context-menu .item .submenu:not(.open-left){left:100%}.calendar-context-menu .item .submenu.open-left{right:100%}.calendar-context-menu .item:hover>.submenu{display:block}.table-striped .calendar table.month tr td,.table-striped .calendar table.month tr th{background-color:transparent}table.month td.day .day-content:hover{background:rgba(0,0,0,.2);cursor:pointer}@-webkit-keyframes sk-bouncedelay{0%,100%,80%{-webkit-transform:scale(0)}40%{-webkit-transform:scale(1)}}@keyframes sk-bouncedelay{0%,100%,80%{-webkit-transform:scale(0);transform:scale(0)}40%{-webkit-transform:scale(1);transform:scale(1)}} -------------------------------------------------------------------------------- /static/css/deadlines.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-size: 16px; 3 | line-height: 23px; 4 | font-weight: 300; 5 | -webkit-font-smoothing: subpixel-antialiased; 6 | } 7 | 8 | body *::selection { 9 | background: #e74c3c; 10 | color: #fff; 11 | } 12 | 13 | .container { 14 | max-width: 980px; 15 | } 16 | 17 | .top-strip { 18 | background-color: #333; 19 | height: 0.25em; 20 | width: 100%; 21 | } 22 | 23 | h1, 24 | h2, 25 | h3 { 26 | /* font-weight: 300; */ 27 | } 28 | 29 | h1 { 30 | margin: 0 0 10px; 31 | font-size: 30px; 32 | line-height: 35px; 33 | } 34 | 35 | h2 { 36 | margin: 0 0 10px; 37 | font-size: 25px; 38 | line-height: 30px; 39 | } 40 | 41 | h3 { 42 | margin: 0; 43 | font-size: 20px; 44 | line-height: 25px; 45 | } 46 | 47 | .page-header { 48 | margin-top: 20px; 49 | margin-bottom: 20px; 50 | } 51 | 52 | #conf-title.page-header { 53 | border-bottom: none; 54 | } 55 | 56 | #conf-full-name { 57 | margin-bottom: 5px; 58 | } 59 | 60 | p.authors { 61 | margin-bottom: 5px; 62 | color: #808080; 63 | font-size: 20px; 64 | } 65 | 66 | p.authors a { 67 | border-color: #dedede; 68 | } 69 | 70 | img { 71 | max-width: 100%; 72 | } 73 | 74 | p { 75 | text-align: justify; 76 | } 77 | 78 | a { 79 | text-decoration: none; 80 | border-bottom: 1px solid #ccc; 81 | color: inherit; 82 | } 83 | 84 | p.lead.authors a { 85 | border-bottom: none; 86 | } 87 | 88 | a:hover, 89 | a:focus { 90 | color: inherit; 91 | text-decoration: none; 92 | } 93 | 94 | .thumb { 95 | margin: 20px 0; 96 | border: 1px solid #808080; 97 | } 98 | 99 | pre { 100 | color: #333; 101 | font-size: 12px; 102 | line-height: 17px; 103 | } 104 | 105 | footer { 106 | font-size: 13px; 107 | } 108 | 109 | .conf-row { 110 | margin-bottom: 5px; 111 | } 112 | 113 | .conf-title, 114 | .conf-title-small, 115 | .conf-title-icon { 116 | font-size: 20px; 117 | font-weight: 400; 118 | 119 | } 120 | 121 | .conf-title-small { 122 | display: none; 123 | } 124 | 125 | .conf-title-icon { 126 | white-space: nowrap; 127 | font-size: 20px; 128 | } 129 | 130 | .deadline, 131 | .meta { 132 | font-size: 13px; 133 | } 134 | 135 | .note { 136 | font-size: 13px; 137 | margin-bottom: 5px; 138 | } 139 | 140 | .timer, 141 | .timer-small { 142 | font-size: 20px; 143 | font-weight: 400; 144 | } 145 | 146 | #confs { 147 | margin-top: 20px; 148 | } 149 | .timer-small { 150 | display: none; 151 | } 152 | 153 | .conf-timer { 154 | font-size: 72px; 155 | color: #444; 156 | margin-top: 40px; 157 | margin-bottom: 0.5em; 158 | } 159 | 160 | #conf-key-facts { 161 | margin-bottom: 10px; 162 | } 163 | 164 | .conf-sub { 165 | cursor: pointer; 166 | } 167 | 168 | .conf-sub::selection { 169 | background: #0097e6; 170 | } 171 | 172 | #conf-sort-order-checkbox, 173 | #cfp-sort-order-checkbox { 174 | text-align: right; 175 | font-size: 14px; 176 | padding-top: 5px; 177 | } 178 | 179 | #conf-sort-order-checkbox input[type="checkbox"]:checked:after, 180 | #cfp-sort-order-checkbox input[type="checkbox"]:checked:after { 181 | background-color: #0097e6; 182 | border-color: #0097e6; 183 | } 184 | 185 | #cfp-sort-order-checkbox input[type="checkbox"]:after, 186 | #cfp-sort-order-checkbox input[type="checkbox"]:focus:after, 187 | #conf-sort-order-checkbox input[type="checkbox"]:after, 188 | #conf-sort-order-checkbox input[type="checkbox"]:focus:after { 189 | border-color: #0097e6; 190 | } 191 | 192 | .filter-label { 193 | text-align: right; 194 | } 195 | 196 | 197 | .pwc-link { 198 | text-decoration: none; 199 | border: none; 200 | vertical-align: middle; 201 | } 202 | 203 | .pwc-link:hover { 204 | border-bottom: 1px solid #1198b2; 205 | } 206 | 207 | .icon-inner { 208 | width: .95em; 209 | height: .95em; 210 | display: inline-block; 211 | vertical-align: middle; 212 | position: relative; 213 | fill: currentColor; 214 | } 215 | 216 | .twitter-github-icons { 217 | line-height: 16px; 218 | } 219 | 220 | #past-events-title, #past-cfps-title { 221 | padding-bottom: 15px; 222 | border-bottom: 2px solid #bb2d3b; 223 | } 224 | 225 | .badge-link { 226 | vertical-align: middle; 227 | margin-bottom: 3px; 228 | margin-left: 2px; 229 | margin-right: 2px; 230 | } 231 | 232 | 233 | .badge-danger { 234 | background-color: #bb2d3b; 235 | } 236 | 237 | @media only screen and (max-width: 768px) { 238 | .conf-timer { 239 | font-size: 64px; 240 | } 241 | .calendar { 242 | margin-bottom: 10px; 243 | } 244 | .filter-label { 245 | text-align: left; 246 | } 247 | } 248 | 249 | @media only screen and (max-width: 576px) { 250 | .conf-timer { 251 | font-size: 36px; 252 | } 253 | .conf-place { 254 | display: none; 255 | } 256 | .conf-date { 257 | display: none; 258 | } 259 | .note { 260 | display: none; 261 | } 262 | .conf-row { 263 | margin-bottom: 7px; 264 | } 265 | .timer { 266 | display: none; 267 | } 268 | .timer-small { 269 | text-align: right; 270 | display: grid; 271 | } 272 | .conf-title { 273 | display: none; 274 | } 275 | .conf-title-small { 276 | display: inline; 277 | } 278 | 279 | } 280 | 281 | @media only screen and (max-width: 375px) { 282 | .conf-timer { 283 | font-size: 28px; 284 | } 285 | } 286 | 287 | .checkbox { 288 | font-size: 12px; 289 | } 290 | 291 | .calendar { 292 | font-size: 12px; 293 | margin-top: 3px; 294 | } 295 | 296 | .calendar img { 297 | margin-right: 5px; 298 | } 299 | 300 | .ind-cal { 301 | margin: 0 5px; 302 | } 303 | 304 | .calendar img { 305 | height: 20px; 306 | } 307 | -------------------------------------------------------------------------------- /utils/sort_yaml.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # coding: utf-8 3 | 4 | # Sort and Clean conference data. 5 | # It writes to `"prefix"data.yml`, copy those to the conference.yml after screening. 6 | 7 | import datetime 8 | import pdb 9 | import sys 10 | import time 11 | import urllib 12 | from builtins import input 13 | from pathlib import Path 14 | from shutil import copyfile 15 | 16 | 17 | import pytz 18 | import requests 19 | import yaml 20 | from tqdm import tqdm 21 | 22 | sys.path.append(".") 23 | from utils import pretty_print, ordered_dump, Loader, get_schema 24 | from date_magic import clean_dates, create_nice_date 25 | 26 | dateformat = "%Y-%m-%d %H:%M:%S" 27 | tba_words = ["tba", "tbd"] 28 | 29 | 30 | def sort_by_cfp(data): 31 | return pytz.utc.normalize( 32 | datetime.datetime.strptime(data["cfp"], dateformat).replace( 33 | tzinfo=pytz.timezone( 34 | data.get("timezone", "AoE") 35 | .replace("AoE", "Etc/GMT+12") 36 | .replace("UTC+", "Etc/GMT-") 37 | .replace("UTC-", "Etc/GMT+") 38 | ) 39 | ) 40 | ).strftime(dateformat) 41 | 42 | 43 | def sort_by_date_passed(data): 44 | right_now = datetime.datetime.utcnow().replace(microsecond=0).strftime(dateformat) 45 | return sort_by_cfp(data) < right_now 46 | 47 | 48 | def order_keywords(data): 49 | schema = get_schema().columns.tolist() 50 | new_dict = {} 51 | for key in schema: 52 | if key in data: 53 | new_dict[key] = data[key] 54 | return new_dict 55 | 56 | 57 | def split_data(data): 58 | conf, tba, expired = [], [], [] 59 | for q in tqdm(data): 60 | if q.get( 61 | "end", datetime.datetime.utcnow().replace(microsecond=0).date() 62 | ) < datetime.datetime.utcnow().replace(microsecond=0).date() - datetime.timedelta(days=37): 63 | expired.append(q) 64 | continue 65 | 66 | q = clean_dates(q) 67 | q = create_nice_date(q) 68 | 69 | try: 70 | if q["cfp"].lower() in tba_words: 71 | tba.append(q) 72 | else: 73 | if " " not in q["cfp"]: 74 | q["cfp"] += " 23:59:00" 75 | conf.append(q) 76 | except: 77 | print(data["cfp"].lower(), tba_words) 78 | return conf, tba, expired 79 | 80 | 81 | def add_latlon(data): 82 | for i, q in tqdm(enumerate(data.copy()), total=len(data)): 83 | if ("location" in q) or ("place" not in q) or ("online" in q["place"].lower()): 84 | continue 85 | else: 86 | url = ( 87 | "https://nominatim.openstreetmap.org/search/" 88 | + urllib.parse.quote(q["place"]) 89 | + "?format=json" 90 | ) 91 | response = requests.get(url) 92 | 93 | if response: 94 | response = response.json() 95 | data[i]["location"] = {} 96 | data[i]["location"]["latitude"] = float(response[0]["lat"]) 97 | data[i]["location"]["longitude"] = float(response[0]["lon"]) 98 | time.sleep(2) 99 | else: 100 | print(f"No response from Openstreetmaps for {q['place']}") 101 | return data 102 | 103 | 104 | # Sort: 105 | def sort_data(base="", prefix=""): 106 | url = Path(base, "_data", "conferences.yml") 107 | out_url = Path(base, "_data", f"{prefix}conferences.yml") 108 | archive = Path(base, "_data", "archive.yml") 109 | out_archive = Path(base, "_data", f"{prefix}archive.yml") 110 | 111 | with open(url, "r") as stream: 112 | try: 113 | data = yaml.load(stream, Loader=Loader) 114 | 115 | print("Initial Sorting:") 116 | for i, q in enumerate(data.copy()): 117 | print(q["cfp"], " - ", q["title"]) 118 | data[i] = order_keywords(q) 119 | 120 | print("\n\n") 121 | 122 | # Geocode Data 123 | print("Adding Lat Lon from Place") 124 | data = add_latlon(data) 125 | 126 | # Split data by cfp 127 | print("Splitting conferences, tba, and archive") 128 | conf, tba, expired = split_data(data) 129 | 130 | # just sort: 131 | conf.sort(key=sort_by_cfp, reverse=True) 132 | pretty_print("Date Sorting:", conf, tba, expired) 133 | conf.sort(key=sort_by_date_passed) 134 | pretty_print("Date and Passed Deadline Sorting with tba:", conf, tba, expired) 135 | 136 | with open(out_url, "w") as outfile: 137 | for line in ordered_dump( 138 | conf + tba, 139 | Dumper=yaml.SafeDumper, 140 | default_flow_style=False, 141 | explicit_start=True, 142 | ).splitlines(): 143 | outfile.write(line.replace("- title:", "\n- title:")) 144 | outfile.write("\n") 145 | except yaml.YAMLError as exc: 146 | print(exc) 147 | 148 | with open(archive, "r") as stream: 149 | try: 150 | data = yaml.load(stream, Loader=Loader) 151 | 152 | for old in expired: 153 | if old not in data: 154 | data.append(old) 155 | 156 | data.sort(key=sort_by_cfp, reverse=True) 157 | data = add_latlon(data) 158 | 159 | pretty_print("New archive:", data) 160 | with open(out_archive, "w") as outfile: 161 | for line in ordered_dump( 162 | data, 163 | Dumper=yaml.SafeDumper, 164 | default_flow_style=False, 165 | explicit_start=True, 166 | ).splitlines(): 167 | outfile.write(line.replace("- title:", "\n- title:")) 168 | outfile.write("\n") 169 | except yaml.YAMLError as exc: 170 | print(exc) 171 | 172 | 173 | if __name__ == "__main__": 174 | sort_data() 175 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Python Deadlines [![pages-build-deployment](https://github.com/JesperDramsch/python-deadlines/actions/workflows/pages/pages-build-deployment/badge.svg?branch=gh-pages)](https://github.com/JesperDramsch/python-deadlines/actions/workflows/pages/pages-build-deployment) 2 | 3 | Countdown timers to keep track of a bunch of Python conference deadlines. 4 | 5 | ## Contributing 6 | 7 | Contributions are very welcome! 8 | 9 | ![GIF of adding a conference to pythondeadlin.es](static/img/pythondeadlines-edit.gif) 10 | 11 | To add or update a deadline: 12 | - Fork the repository 13 | - Update `_data/conferences.yml` 14 | - Make sure it has the `title`, `year`, `id`, `link`, `cfp`, `timezone`, `date`, `place`, `sub` attributes 15 | + This [online web app](https://timezonefinder.michelfe.it/) makes it easy to find timezones – just click! 16 | (Based on [timezonefinder](https://github.com/jannikmi/timezonefinder) library) 17 | + Alternatively, see available timezone strings [here](https://momentjs.com/timezone/). 18 | - Optionally add a `note` 19 | - Send a [pull request](_data/conferences.yml) 20 | 21 | If that is not possible you can try and submit your conference through this [Google Form](https://forms.gle/UUqiprHjRfvGp6Fs6) but that may take a second. 22 | 23 | ### Example 24 | 25 | ```yaml 26 | - title: BestConf # Title of conference without year 27 | year: 2022 # Year 28 | link: link-to-website.com # URL to conference 29 | cfp_link: link-to-cfp.com # URL to call for proposals (Optional) 30 | cfp: 'YYYY-MM-DD HH:mm:ss' # Deadline for Call for Participation / Proposals 31 | workshop_deadline: 'YYYY-MM-DD HH:mm:ss' # Workshop deadline if different from cfp (Optional) 32 | tutorial_deadline: 'YYYY-MM-DD HH:mm:ss' # Tutorial deadline if different from cfp (Optional) 33 | timezone: Asia/Seoul # Standard IANA Timezones (Omit for AoE) 34 | place: Incheon, South Korea # City, Country 35 | date: September 18 - 22, 2022 # Nicely written dates of conference 36 | start: YYYY-MM-DD # Start date of conference for calendar 37 | end: YYYY-MM-DD # End date of conference for calendar 38 | sponsor: link-to-sponsor.page # URL to Sponsorship page (Optional) 39 | finaid: link-to-finaid.page # URL to Financial Aid page (Optional) 40 | twitter: BestConfEver # Twitter handle of conference (Optional) 41 | mastodon: https://mastodon.social/@bconf # Mastodon handle of conference (Optional) 42 | sub: PY # Type of conference (see or add _data/types.yml) 43 | note: Important # In case there are extra notes about the conference (Optional) 44 | location: # Geolocation for inclusion in map 45 | latitude: 0.00 46 | longitude: 0.00 47 | ``` 48 | 49 | ### Description of entries 50 | 51 | | `sub` | Description | Type | Required | 52 | | ----------- | ------------------------------------------------- | ------- | -------- | 53 | | `title` | Title of the conference | `str` | ✔ | 54 | | `year` | Year of this conference | `int` | ✔ | 55 | | `link` | URL to conference | `str` | ✔ | 56 | | `cfp_link` | URL to call for proposals | `str` | | 57 | | `cfp` | Deadline for Call for Participation / Proposals | `str` | ✔ | 58 | | `workshop_deadline` | Workshop deadline if different from cfp | `str` | | 59 | | `tutorial_deadline` | Tutorial deadline if different from cfp | `str` | | 60 | | `timezone` | Standard [IANA Timezones](https://timezonefinder.michelfe.it/) (Omit for AoE) | `str` | ✔ | 61 | | `place` | City, Country | `str` | ✔ | 62 | | `date` | Nicely written dates of conference | `str` | ✔ | 63 | | `start` | Start date of conference for calendar | `date` | ✔ | 64 | | `end` | End date of conference for calendar | `date` | ✔ | 65 | | `finaid` | URL to financial aid information | `str` | | 66 | | `sponsor` | URL to sponsorship opportunities | `str` | | 67 | | `twitter` | Twitter handle of conference | `str` | | 68 | | `mastodon` | Mastodon handle of conference | `str` | | 69 | | `sub` | Type of conference | `str` | | 70 | | `note` | Extra notes about the conference | `str` | | 71 | | `location` | Geolocation for inclusion in map | `str` | | 72 | | `latitude` | Latitude of venue | `float` | | 73 | | `longitude` | Longitude of venue | `float` | | 74 | 75 | 76 | ### Conference types for `sub` 77 | 78 | | `sub` | Category name | 79 | | -------- | ----------------- | 80 | | `PY` | General Python | 81 | | `SCIPY` | Scientific Python | | 82 | | `PYDATA` | Python for Data | 83 | | `WEB` | Python for Web | 84 | 85 | 86 | ## Forks & other useful listings 87 | 88 | - [aideadlines][2] the original 89 | - [geodeadlin.es][3] by @LukasMosser 90 | - [neuro-deadlines][4] by @tbryn 91 | - [ai-challenge-deadlines][5] by @dieg0as 92 | - [CV-oriented ai-deadlines (with an emphasis on medical images)][8] by @duducheng 93 | - [es-deadlines (Embedded Systems, Computer Architecture, and Cyber-physical Systems)][9] by @AlexVonB and @k0nze 94 | - [2019-2020 International Conferences in AI, CV, DM, NLP and Robotics][10] by @JackieTseng 95 | - [ccf-deadlines][11] by @ccfddl 96 | - [netdeadlines.com][12] by @albertgranalcoz 97 | - [ad-deadlines.com][13] by @daniel-bogdoll 98 | 99 | ## License 100 | 101 | This project is licensed under [MIT][1]. 102 | 103 | It uses: 104 | 105 | - [IcoMoon Icons](https://icomoon.io/#icons-icomoon): [GPL](http://www.gnu.org/licenses/gpl.html) / [CC BY4.0](http://creativecommons.org/licenses/by/4.0/) 106 | 107 | [1]: https://abhshkdz.mit-license.org/ 108 | [2]: http://aideadlin.es/ 109 | [3]: https://github.com/LukasMosser/geo-deadlines 110 | [4]: https://github.com/tbryn/neuro-deadlines 111 | [5]: https://github.com/dieg0as/ai-challenge-deadlines 112 | [6]: http://www.conferenceranks.com/# 113 | [8]: https://m3dv.github.io/ai-deadlines/ 114 | [9]: https://ekut-es.github.io/es-deadlines/ 115 | [10]: https://jackietseng.github.io/conference_call_for_paper/conferences.html 116 | [11]: https://ccfddl.github.io/ 117 | [12]: https://netdeadlines.com/ 118 | [13]: https://ad-deadlines.com/ 119 | -------------------------------------------------------------------------------- /static/js/ouical.min.js: -------------------------------------------------------------------------------- 1 | !function(e){var o=function(e){return e.toISOString().replace(/-|:|\.\d+/g,"")},t=function(e){return e.end?o(e.end):o(new Date(e.start.getTime()+6e4*e.duration))},n={google:function(e){var n=o(e.start),i=t(e);return'Google'},yahoo:function(e){var t=e.end?(e.end.getTime()-e.start.getTime())/6e4:e.duration,n=(t<600?"0"+Math.floor(t/60):Math.floor(t/60)+"")+(t%60<10?"0"+t%60:t%60+""),i=o(new Date(e.start-6e4*e.start.getTimezoneOffset()))||"";return'Yahoo!'},ics:function(e,n,i){var a=o(e.start),d=t(e);return''+i+""},ical:function(e){return this.ics(e,"icon-ical","iCal")},outlook:function(e){return this.ics(e,"icon-outlook","Outlook")}},i=function(){var e=document.createElement("style");return e.id="ouical-css",e.innerHTML="background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFQAAAAQCAYAAACIoli7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo0MzJCRDU2NUE1MDIxMUUyOTY1Q0EwNTkxNEJDOUIwNCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0MzJCRDU2NkE1MDIxMUUyOTY1Q0EwNTkxNEJDOUIwNCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjQzMkJENTYzQTUwMjExRTI5NjVDQTA1OTE0QkM5QjA0IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjQzMkJENTY0QTUwMjExRTI5NjVDQTA1OTE0QkM5QjA0Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+1Gcb3QAACh1JREFUeNrEWAtwVNUZ/u7d9yvZJBtMIC8eBhIKMkQIhqIBKirWwpSW0dahCir1gQhWg2XKjNRqR7AjQ6QjglBFRIW20KmC0KRYjRYMCZGHGEjIY0Oy2U32lX3d3Xv6nxuSbEJCQNvpn/n33POfxz33u9//uBGaBQFcMhgrpGYC6ddk+zfiZKgxsvOG4buJMGATNtzcq4l+WStbsGgpvOiELpgBWetGQGNCstSGkKwH1Ek04oVNFUZQsEAjedCg0iBRVivrP737CL+H8Na7f7lpRFa2cOfMqdUn9n3ARGc7NLEYJj62Qle6Z3/ZlATt82mINV4QVPV33HVXmK/1bRgPvst60vzXgJzZZ84UlOfnV1L/YvwhBxk7Q7quZ3zZLrvSivRy+PtR0Y8oUit2P7+aWm5TifxahErVPWfd/JRBQaNVjA2CIhsecEwIubHzB3+CQWNDNBCCyuiEC6NgpV3agkCszYWknBTInjAMFh20HAo1/QQFVM7Kw9aly7D1ze2iJEemhbu8Mzf++rkVNGMkaS7puKadb0yubGscp/Wa3rc0nNXVJ6RsJvsaUhmXt5oyZv36e4o//hi1tbUonjWrYNTs2QXxhywuL+8bmzevoG7dOu3gj8Po2MIVZGIcAw6TcPma0YV4JfXYEBiy/rbeqZcv+i1tEbIgagzgOAWMerT5MvDuXgfOH6vAsRoRgVAqHOp2TMrX4dYfFmLhVAHTRqtgkn0QQ3W0anZK+UsvzJe/qflxi2d04a3u9iJWdngUHd/I33KEyJEoqBE2mqCxGBCqq//p8idWvPh66Wa35ZlzUIcAnez3w+n14uwDD8CalYWo293vYePH+Fy+Jn58289HKu2rpbux9KF7EY4yfHroAHKL5iv2w/v2Ye7CBfBHBLRWHYJ54rzrCQcsDtx+YA4MAbyTqjsHLfLIrWWcChjwu/XHUVnuxrGDC2G2AdwnnKQNXwOLHnwFH4da8VnZBpg0ZqgcOgJMfKa+oqJkTDQMX3or3GF/khgJQ9TroDInQENq9rjItaNwqUWkeDoy0wtmTKYt/8XPpg4wZpADARTt2YOJx45Bo9PBlZEBy86dvQedPGkSxmZnw5SQAD6Xrxns6XWmYO+1x3e+n52D2WM3Y96w6F0F1F4wBwsBprBEv+0wIQO7Xj2HC0ercLbiEdi0zYgyAk1OgFUQccONwP5dyxELNMCQ5Cfq0YZpekgCpMZgENPvmIc5KckEm4gL7+9BrL0d1rFjYSGGGkePgyWX4qU1CQW3zVG5ztV+n25aQRpVGBojkFpWroTBaAQ/TpD6eput3xOZzWaKEjL43IEM3frHLZD8XtyQasXhdzbDbNTCJjN89tftvfaW8jd67fPyzP3jRBzThGGYKgwxrcceM2eyYDQNG9+8iAMfHsaRXY/AouV4qRAS9NCrmmkjKxBKwOQsM8X0iQhQkpK1IUiiBxq1+oLfaPJJXo8lEOyCJtGKScsfhTYpGYItFTUXG9DY2oqQw4UnFi5SGF/2zfkialQcUJ66V7PrFL5mQhwgXGRZZjv+8ALzBGPM4YuyA9s3sFMtIUW5/Xx7hNU0+RU7X7OM5bFlJxSQ2ODR+ArlIUy5HDjW04y+t5UrC9J5Vm5tYxkz/s5YF3WiESYzP2MRmbmp6+EH9vuZxM9N9iBz0ViUHbclsPuX/GJ2SUnJeX+LnUW6/MqzHTp6lL29dy9rtLewx598kpWsWcPuu+8+Fo1GlfG9+/bZn1q1Kk1JzHQSlUxHjBL7rkX5XL5mMBQks7WvY0vvZ3d4pW63j7Nfo/QDfYCbs3iGa6UORYMUP/92qhoYE4VsdNCoDEEyUYqnhBIDEmJ8hZYenKdmETH6468pWa3GJbvdHpKiTWpio4YSz7Hjx7Hu2Wdx9KOPkDkyHaWbNiE/Lw+LFy+makWlHCInOyc9MyOTJ3JRzcEhnCHHYtf0dCJtwrrp3Suvv/UGvO4uWBLN2L9/N7xeFzyedrS43+q1F401DQdaP+8Vrg1ppcRS3t+DDVQe9dhFqF3JiHTaIYaTyL2jYIld8IsGWCQRTB+GoCcgiU5q2QCD6KNFdQjrM1FVXeUYd+PYxg6nE+np6ZiYn48dO3Zg7dq1iEQi0Gq1KKeqh1h82T2BURkZQlpa2kzqHuJ1qEph3zCAPnVyDao8X6EgeQowANDlSx7mfo9t772NBQt+pmT5T468jgmFS5TxiqPvdderLO+Kfcnte2X71G9VzCvjulhfZaJFFjJSrCj7/DjCqgh0VN6EvSIsCUAXndxPvDxf1w5t4gjoY1qEnAYUfI8SpuokOlyIBIPhC06nSwHUZDIhNzcXoVAIRF7k5OQoLc83/E1eutSKpuYmRKToLZs3l6Zzhqo5QyPR6FVPfcJZg2lFN6Py80q+kbp2WzLwUEe/OZ2Ovr4YU11przqL/5XoRH3fvakwmjFdQtlH4/FC6VdY/dRNVKEYeMqAUR3EiSo9Vj56As2+MKwGMx68fySm5o+HSeDh6FLM7/fVu1zO3v24axcUFJDneZX+SkrgXq8PlZUnEKKKwGpNgM/rmaLT66Z1uzwxVBoC0JKqtTjpPtVd8sQ8YJKM+g3W5Ze/HpZ3f9r0kahk5aq41b/st1c8A3uYOQQrr0uyFwep+ujrG6HHip/YsPvlTmz+7dcovnMGZk4gt6cYKXQFMWuyAV98+iOcpfB6e9HzFBvvoS87J9XfynKZWFnfbLfzbwOlmpEkCauffhpejxenvjqF7KxsdPF6PByCz+PH6dOnKVRUW8eMGX1LN0MJ0MgQLl/dVgNb8YjuAj/qRFJhMmYVzkkv/3NZAV6jJPS4W/gWGLDr/Ua/mkQMzQM2T4dN58Q/DxbizuIKLLjtHax7bhqWPJaLVJMWPsXpzah3SWj3n6GQMKf7/wAmP6/65fq6uubGpsaOFntLuqPdARe5v4fY2emi1uej/OBmjjan3+V2tfi8voZYLFoXlaJnjQZDhZoJgi7GXX4IQPNN+Th9sJuhmKuCWM5w5pvqNiSLlfg/yhcLx2PEqA+QqhR/wX5jHirrdbIJI24A/lG9Gqt/U45NWz7Ey9s/BzQ3QpUQQajdjMS0NixdtQhFxTfTGzVQDc6rFJ/85Zdfem6ePr29dMuWdGKi5PV6Ov2BQFMoFL5INXqtx+upd3d21rXY7Y5AIMBvTp8FCJeXl/nVBKNFRa7Ag+xgsnH2K0p79+474Ix1IJWy5qgXuw40MPb8dwFkOFfngA0nY9zqQe1WnrQtzQRSBgwGEXs2zqUHmXvFvCCFLwP/Lw6PdhQLjVqFVIwSkCRFIgdPVp+sI66d7ury1Xrc7saGhkZ7OBziAEpxGotXYYQg/J4CReZwh3fdriqM2IQkrZN1mg/H9joY+4DMvSyt+eQlTL71uf8a+65VfvVw5nDh5Jpl58NHMK5FCT88diaSGi4DFYnTHvDkgTUyl/8IMABtKh8piZwIuwAAAABJRU5ErkJggg==);margin-right:.5em;content:' '}.icon-ical:before{background-position:-68px 0}.icon-outlook:before{}.icon-yahoo:before{background-position:-36px +4px}.icon-google:before{background-position:-52px 0}",e},a=function(e,o,t){var n=document.createElement("div");return n.innerHTML='',Object.keys(e).forEach(function(o){n.innerHTML+=''+e[o]+""}),n.className="add-to-calendar",void 0!==o&&(n.className+=" "+o),document.getElementById("ouical-css")||document.getElementsByTagName("head")[0].appendChild(i()),n.id=t,n};e.createCalendar=function(e){var o,t,i;if(void 0!==(o=e).data&&void 0!==o.data.start&&(void 0!==o.data.end||void 0!==o.data.duration))return a((i=e.data,{google:n.google(i),yahoo:n.yahoo(i),ical:n.ical(i),outlook:n.outlook(i)}),function(e){if(e.options&&e.options.class)return e.options.class}(e),(t=e).options&&t.options.id?t.options.id:Math.floor(1e6*Math.random()));console.log("Event details missing.")}}(this); -------------------------------------------------------------------------------- /404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Python Conference Deadlines 8 | 9 | 10 | Python Conference Deadlines | Countdowns to your favourite Python 11 | conferences 12 | 13 | 14 | 15 | 16 | 17 | 21 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 47 | 48 | 49 | 55 | 56 | 62 | 63 | 68 | 74 | 80 | 81 | 82 | 83 | 132 | 133 | 138 | 142 | 143 | 144 | 145 | 149 | 150 | 151 | 152 | 156 | 157 | 158 | 159 | 224 |
225 |
226 |

404

227 |
228 |
Page not found! :(
229 |
230 |
231 | 265 |
266 | 267 | 268 | -------------------------------------------------------------------------------- /python-deadlines.ics: -------------------------------------------------------------------------------- 1 | BEGIN:VCALENDAR 2 | METHOD:PUBLISH 3 | VERSION:2.0 4 | PRODID:-//https://pythondeadlin.es//python-deadlines//EN 5 | X-PUBLISHED-TTL:PT1H 6 | 7 | BEGIN:VEVENT 8 | SUMMARY:PyHEP 2023 Deadline 9 | UID: 10 | ORGANIZER:pythondeadlin.es 11 | DTSTAMP:20230809T191436Z 12 | DTSTART;TZID=Europe/Zurich:20230906T235900 13 | END:VEVENT 14 | 15 | 16 | BEGIN:VEVENT 17 | SUMMARY:PyLadiesCon 2023 Deadline 18 | UID: 19 | ORGANIZER:pythondeadlin.es 20 | DTSTAMP:20230809T191436Z 21 | DTSTART;TZID=:20230904T235900 22 | END:VEVENT 23 | 24 | 25 | BEGIN:VEVENT 26 | SUMMARY:PyCon Sweden 2023 Deadline 27 | UID: 28 | ORGANIZER:pythondeadlin.es 29 | DTSTAMP:20230809T191436Z 30 | DTSTART;TZID=Europe/Stockholm:20230901T235900 31 | END:VEVENT 32 | 33 | 34 | BEGIN:VEVENT 35 | SUMMARY:PyCon South Africa 2023 Tutorial Deadline 36 | UID:-tutorial 37 | ORGANIZER:pythondeadlin.es 38 | DTSTAMP:20230809T191436Z 39 | DTSTART;TZID=Africa/Johannesburg:20230818T235900 40 | END:VEVENT 41 | BEGIN:VEVENT 42 | SUMMARY:PyCon South Africa 2023 Deadline 43 | UID: 44 | ORGANIZER:pythondeadlin.es 45 | DTSTAMP:20230809T191436Z 46 | DTSTART;TZID=Africa/Johannesburg:20230818T235900 47 | END:VEVENT 48 | 49 | BEGIN:VEVENT 50 | SUMMARY:PyCon Thailand 2023 Workshop Deadline 51 | UID:-workshop 52 | ORGANIZER:pythondeadlin.es 53 | DTSTAMP:20230809T191436Z 54 | DTSTART;TZID=Etc/GMT:20230816T235900 55 | END:VEVENT 56 | 57 | BEGIN:VEVENT 58 | SUMMARY:PyCon Thailand 2023 Deadline 59 | UID: 60 | ORGANIZER:pythondeadlin.es 61 | DTSTAMP:20230809T191436Z 62 | DTSTART;TZID=Etc/GMT:20230816T235900 63 | END:VEVENT 64 | 65 | 66 | BEGIN:VEVENT 67 | SUMMARY:PyCon India 2023 Deadline 68 | UID: 69 | ORGANIZER:pythondeadlin.es 70 | DTSTAMP:20230809T191436Z 71 | DTSTART;TZID=Asia/Kolkata:20230805T235900 72 | END:VEVENT 73 | 74 | 75 | BEGIN:VEVENT 76 | SUMMARY:PyCon Ireland 2023 Deadline 77 | UID: 78 | ORGANIZER:pythondeadlin.es 79 | DTSTAMP:20230809T191436Z 80 | DTSTART;TZID=Etc/GMT:20230716T235900 81 | END:VEVENT 82 | 83 | 84 | BEGIN:VEVENT 85 | SUMMARY:PyCon Indonesia 2023 Deadline 86 | UID: 87 | ORGANIZER:pythondeadlin.es 88 | DTSTAMP:20230809T191436Z 89 | DTSTART;TZID=:20230715T165959 90 | END:VEVENT 91 | 92 | 93 | BEGIN:VEVENT 94 | SUMMARY:PyData Tel Aviv 2023 Deadline 95 | UID: 96 | ORGANIZER:pythondeadlin.es 97 | DTSTAMP:20230809T191436Z 98 | DTSTART;TZID=Asia/Jerusalem:20230714T235900 99 | END:VEVENT 100 | 101 | 102 | BEGIN:VEVENT 103 | SUMMARY:DjangoCon Africa 2023 Deadline 104 | UID: 105 | ORGANIZER:pythondeadlin.es 106 | DTSTAMP:20230809T191436Z 107 | DTSTART;TZID=:20230712T235900 108 | END:VEVENT 109 | 110 | 111 | BEGIN:VEVENT 112 | SUMMARY:Swiss Python Summit 2023 Deadline 113 | UID: 114 | ORGANIZER:pythondeadlin.es 115 | DTSTAMP:20230809T191436Z 116 | DTSTART;TZID=Europe/Zurich:20230701T235900 117 | END:VEVENT 118 | 119 | 120 | BEGIN:VEVENT 121 | SUMMARY:PyCon Portugal 2023 Tutorial Deadline 122 | UID:-tutorial 123 | ORGANIZER:pythondeadlin.es 124 | DTSTAMP:20230809T191436Z 125 | DTSTART;TZID=Etc/GMT:20230630T235900 126 | END:VEVENT 127 | BEGIN:VEVENT 128 | SUMMARY:PyCon Portugal 2023 Deadline 129 | UID: 130 | ORGANIZER:pythondeadlin.es 131 | DTSTAMP:20230809T191436Z 132 | DTSTART;TZID=Etc/GMT:20230630T235900 133 | END:VEVENT 134 | 135 | 136 | BEGIN:VEVENT 137 | SUMMARY:PyCon UK 2023 Deadline 138 | UID: 139 | ORGANIZER:pythondeadlin.es 140 | DTSTAMP:20230809T191436Z 141 | DTSTART;TZID=Europe/London:20230630T165900 142 | END:VEVENT 143 | 144 | BEGIN:VEVENT 145 | SUMMARY:PyCon CZ 2023 Workshop Deadline 146 | UID:-workshop 147 | ORGANIZER:pythondeadlin.es 148 | DTSTAMP:20230809T191436Z 149 | DTSTART;TZID=Europe/Prague:20230625T235900 150 | END:VEVENT 151 | 152 | BEGIN:VEVENT 153 | SUMMARY:PyCon CZ 2023 Tutorial Deadline 154 | UID:-tutorial 155 | ORGANIZER:pythondeadlin.es 156 | DTSTAMP:20230809T191436Z 157 | DTSTART;TZID=Europe/Prague:20230625T235900 158 | END:VEVENT 159 | BEGIN:VEVENT 160 | SUMMARY:PyCon CZ 2023 Deadline 161 | UID: 162 | ORGANIZER:pythondeadlin.es 163 | DTSTAMP:20230809T191436Z 164 | DTSTART;TZID=Europe/Prague:20230625T235900 165 | END:VEVENT 166 | 167 | 168 | BEGIN:VEVENT 169 | SUMMARY:PyCon España 2023 Deadline 170 | UID: 171 | ORGANIZER:pythondeadlin.es 172 | DTSTAMP:20230809T191436Z 173 | DTSTART;TZID=Europe/London:20230623T235900 174 | END:VEVENT 175 | 176 | 177 | BEGIN:VEVENT 178 | SUMMARY:AfroPython Conf 2023 Deadline 179 | UID: 180 | ORGANIZER:pythondeadlin.es 181 | DTSTAMP:20230809T191436Z 182 | DTSTART;TZID=America/Bahia:20230619T235900 183 | END:VEVENT 184 | 185 | 186 | BEGIN:VEVENT 187 | SUMMARY:PyCon Hong Kong 2023 Deadline 188 | UID: 189 | ORGANIZER:pythondeadlin.es 190 | DTSTAMP:20230809T191436Z 191 | DTSTART;TZID=Asia/Hong_Kong:20230618T235900 192 | END:VEVENT 193 | 194 | 195 | BEGIN:VEVENT 196 | SUMMARY:PyData Amsterdam 2023 Tutorial Deadline 197 | UID:-tutorial 198 | ORGANIZER:pythondeadlin.es 199 | DTSTAMP:20230809T191436Z 200 | DTSTART;TZID=Europe/Amsterdam:20230611T235900 201 | END:VEVENT 202 | BEGIN:VEVENT 203 | SUMMARY:PyData Amsterdam 2023 Deadline 204 | UID: 205 | ORGANIZER:pythondeadlin.es 206 | DTSTAMP:20230809T191436Z 207 | DTSTART;TZID=Europe/Amsterdam:20230611T235900 208 | END:VEVENT 209 | 210 | 211 | BEGIN:VEVENT 212 | SUMMARY:Python Brasil 2023 Deadline 213 | UID: 214 | ORGANIZER:pythondeadlin.es 215 | DTSTAMP:20230809T191436Z 216 | DTSTART;TZID=America/Sao_Paulo:20230608T235900 217 | END:VEVENT 218 | 219 | 220 | BEGIN:VEVENT 221 | SUMMARY:PyCon Asia Pacific 2023 Deadline 222 | UID: 223 | ORGANIZER:pythondeadlin.es 224 | DTSTAMP:20230809T191436Z 225 | DTSTART;TZID=:20230531T235959 226 | END:VEVENT 227 | 228 | 229 | BEGIN:VEVENT 230 | SUMMARY:PyCon MEA @GlobalDevSlam 2023 Deadline 231 | UID: 232 | ORGANIZER:pythondeadlin.es 233 | DTSTAMP:20230809T191436Z 234 | DTSTART;TZID=Asia/Dubai:20230531T235900 235 | END:VEVENT 236 | 237 | 238 | BEGIN:VEVENT 239 | SUMMARY:PyCon Malaysia 2023 Deadline 240 | UID: 241 | ORGANIZER:pythondeadlin.es 242 | DTSTAMP:20230809T191436Z 243 | DTSTART;TZID=Asia/Kuala_Lumpur:20230531T235900 244 | END:VEVENT 245 | 246 | 247 | BEGIN:VEVENT 248 | SUMMARY:North Bay Python 2023 Deadline 249 | UID: 250 | ORGANIZER:pythondeadlin.es 251 | DTSTAMP:20230809T191436Z 252 | DTSTART;TZID=America/Los_Angeles:20230519T235900 253 | END:VEVENT 254 | 255 | 256 | BEGIN:VEVENT 257 | SUMMARY:Kiwi PyCon 2023 Deadline 258 | UID: 259 | ORGANIZER:pythondeadlin.es 260 | DTSTAMP:20230809T191436Z 261 | DTSTART;TZID=Pacific/Auckland:20230519T235900 262 | END:VEVENT 263 | 264 | 265 | BEGIN:VEVENT 266 | SUMMARY:PyGotham TV 2023 Deadline 267 | UID: 268 | ORGANIZER:pythondeadlin.es 269 | DTSTAMP:20230809T191436Z 270 | DTSTART;TZID=:20230515T235900 271 | END:VEVENT 272 | 273 | 274 | BEGIN:VEVENT 275 | SUMMARY:DjangoCon US 2023 Tutorial Deadline 276 | UID:-tutorial 277 | ORGANIZER:pythondeadlin.es 278 | DTSTAMP:20230809T191436Z 279 | DTSTART;TZID=America/New_York:20230515T235900 280 | END:VEVENT 281 | BEGIN:VEVENT 282 | SUMMARY:DjangoCon US 2023 Deadline 283 | UID: 284 | ORGANIZER:pythondeadlin.es 285 | DTSTAMP:20230809T191436Z 286 | DTSTART;TZID=America/New_York:20230515T180000 287 | END:VEVENT 288 | 289 | 290 | BEGIN:VEVENT 291 | SUMMARY:PyCon Australia 2023 Deadline 292 | UID: 293 | ORGANIZER:pythondeadlin.es 294 | DTSTAMP:20230809T191436Z 295 | DTSTART;TZID=Australia/Adelaide:20230515T235900 296 | END:VEVENT 297 | 298 | 299 | BEGIN:VEVENT 300 | SUMMARY:EuroSciPy 2023 Deadline 301 | UID: 302 | ORGANIZER:pythondeadlin.es 303 | DTSTAMP:20230809T191436Z 304 | DTSTART;TZID=Europe/Berlin:20230514T235959 305 | END:VEVENT 306 | 307 | 308 | BEGIN:VEVENT 309 | SUMMARY:PyCon Korea 2023 Deadline 310 | UID: 311 | ORGANIZER:pythondeadlin.es 312 | DTSTAMP:20230809T191436Z 313 | DTSTART;TZID=Asia/Seoul:20230514T235900 314 | END:VEVENT 315 | 316 | 317 | BEGIN:VEVENT 318 | SUMMARY:DjangoCon Australia 2023 Deadline 319 | UID: 320 | ORGANIZER:pythondeadlin.es 321 | DTSTAMP:20230809T191436Z 322 | DTSTART;TZID=Australia/Adelaide:20230514T235900 323 | END:VEVENT 324 | 325 | 326 | BEGIN:VEVENT 327 | SUMMARY:PyCon Estonia 2023 Tutorial Deadline 328 | UID:-tutorial 329 | ORGANIZER:pythondeadlin.es 330 | DTSTAMP:20230809T191436Z 331 | DTSTART;TZID=Europe/Tallinn:20230509T235900 332 | END:VEVENT 333 | BEGIN:VEVENT 334 | SUMMARY:PyCon Estonia 2023 Deadline 335 | UID: 336 | ORGANIZER:pythondeadlin.es 337 | DTSTAMP:20230809T191436Z 338 | DTSTART;TZID=Europe/Tallinn:20230509T235959 339 | END:VEVENT 340 | 341 | 342 | BEGIN:VEVENT 343 | SUMMARY:PyCon Latin America 2023 Deadline 344 | UID: 345 | ORGANIZER:pythondeadlin.es 346 | DTSTAMP:20230809T191436Z 347 | DTSTART;TZID=Etc/GMT:20230507T235900 348 | END:VEVENT 349 | 350 | 351 | BEGIN:VEVENT 352 | SUMMARY:PyCon Uganda 2023 Deadline 353 | UID: 354 | ORGANIZER:pythondeadlin.es 355 | DTSTAMP:20230809T191436Z 356 | DTSTART;TZID=Africa/Kampala:20230505T235900 357 | END:VEVENT 358 | 359 | 360 | BEGIN:VEVENT 361 | SUMMARY:PyCon Israel 2023 Deadline 362 | UID: 363 | ORGANIZER:pythondeadlin.es 364 | DTSTAMP:20230809T191436Z 365 | DTSTART;TZID=Africa/Cairo:20230402T225900 366 | END:VEVENT 367 | 368 | 369 | BEGIN:VEVENT 370 | SUMMARY:PyCon Taiwan 2023 Deadline 371 | UID: 372 | ORGANIZER:pythondeadlin.es 373 | DTSTAMP:20230809T191436Z 374 | DTSTART;TZID=:20230331T235959 375 | END:VEVENT 376 | 377 | 378 | BEGIN:VEVENT 379 | SUMMARY:PyCon Poland 2023 Deadline 380 | UID: 381 | ORGANIZER:pythondeadlin.es 382 | DTSTAMP:20230809T191436Z 383 | DTSTART;TZID=Europe/Warsaw:20230327T235900 384 | END:VEVENT 385 | 386 | 387 | BEGIN:VEVENT 388 | SUMMARY:EuroPython 2023 Deadline 389 | UID: 390 | ORGANIZER:pythondeadlin.es 391 | DTSTAMP:20230809T191436Z 392 | DTSTART;TZID=:20230326T235900 393 | END:VEVENT 394 | 395 | 396 | BEGIN:VEVENT 397 | SUMMARY:PyCon Russia 2023 Deadline 398 | UID: 399 | ORGANIZER:pythondeadlin.es 400 | DTSTAMP:20230809T191436Z 401 | DTSTART;TZID=Europe/Moscow:20230315T235900 402 | END:VEVENT 403 | 404 | 405 | BEGIN:VEVENT 406 | SUMMARY:SciPy 2023 Deadline 407 | UID: 408 | ORGANIZER:pythondeadlin.es 409 | DTSTAMP:20230809T191436Z 410 | DTSTART;TZID=America/Chicago:20230301T235900 411 | END:VEVENT 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | END:VCALENDAR 429 | -------------------------------------------------------------------------------- /sitemap.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | https://pythondeadlin.es/resources/how-to-get-presentation-python-conferences/ 5 | 2023-03-03T00:00:00+00:00 6 | 7 | 8 | https://pythondeadlin.es/resources/how-to-get-started-talk-python-conferences/ 9 | 2023-03-04T00:00:00+00:00 10 | 11 | 12 | https://pythondeadlin.es/resources/what-are-python-cfps/ 13 | 2023-03-05T00:00:00+00:00 14 | 15 | 16 | https://pythondeadlin.es/resources/good-conference-talk-proposals/ 17 | 2023-03-06T00:00:00+00:00 18 | 19 | 20 | https://pythondeadlin.es/resources/find-target-audience/ 21 | 2023-03-07T00:00:00+00:00 22 | 23 | 24 | https://pythondeadlin.es/resources/common-pitfalls/ 25 | 2023-03-08T00:00:00+00:00 26 | 27 | 28 | https://pythondeadlin.es/resources/what-about/ 29 | 2023-03-09T00:00:00+00:00 30 | 31 | 32 | https://pythondeadlin.es/resources/beyond-python-deadlines/ 33 | 2023-06-25T00:00:00+00:00 34 | 35 | 36 | https://pythondeadlin.es/archive/ 37 | 38 | 39 | https://pythondeadlin.es/calendar/ 40 | 41 | 42 | https://pythondeadlin.es/conference/ 43 | 44 | 45 | https://pythondeadlin.es/ 46 | 47 | 48 | https://pythondeadlin.es/map/ 49 | 50 | 51 | https://pythondeadlin.es/legal/privacy-policy/ 52 | 53 | 54 | https://pythondeadlin.es/resources/ 55 | 56 | 57 | https://pythondeadlin.es/legal/terms-conditions/ 58 | 59 | 60 | https://pythondeadlin.es/conference/pyhep-2023/ 61 | 62 | 63 | https://pythondeadlin.es/conference/pyladiescon-2023/ 64 | 65 | 66 | https://pythondeadlin.es/conference/pycon-sweden-2023/ 67 | 68 | 69 | https://pythondeadlin.es/conference/pycon-south-africa-2023/ 70 | 71 | 72 | https://pythondeadlin.es/conference/pycon-thailand-2023/ 73 | 74 | 75 | https://pythondeadlin.es/conference/pycon-india-2023/ 76 | 77 | 78 | https://pythondeadlin.es/conference/pycon-ireland-2023/ 79 | 80 | 81 | https://pythondeadlin.es/conference/pycon-indonesia-2023/ 82 | 83 | 84 | https://pythondeadlin.es/conference/pydata-tel-aviv-2023/ 85 | 86 | 87 | https://pythondeadlin.es/conference/djangocon-africa-2023/ 88 | 89 | 90 | https://pythondeadlin.es/conference/swiss-python-summit-2023/ 91 | 92 | 93 | https://pythondeadlin.es/conference/pycon-portugal-2023/ 94 | 95 | 96 | https://pythondeadlin.es/conference/pycon-uk-2023/ 97 | 98 | 99 | https://pythondeadlin.es/conference/pycon-cz-2023/ 100 | 101 | 102 | https://pythondeadlin.es/conference/pycon-espaa-2023/ 103 | 104 | 105 | https://pythondeadlin.es/conference/afropython-conf-2023/ 106 | 107 | 108 | https://pythondeadlin.es/conference/pycon-hong-kong-2023/ 109 | 110 | 111 | https://pythondeadlin.es/conference/pydata-amsterdam-2023/ 112 | 113 | 114 | https://pythondeadlin.es/conference/python-brasil-2023/ 115 | 116 | 117 | https://pythondeadlin.es/conference/pycon-asia-pacific-2023/ 118 | 119 | 120 | https://pythondeadlin.es/conference/pycon-mea-globaldevslam-2023/ 121 | 122 | 123 | https://pythondeadlin.es/conference/pycon-malaysia-2023/ 124 | 125 | 126 | https://pythondeadlin.es/conference/north-bay-python-2023/ 127 | 128 | 129 | https://pythondeadlin.es/conference/kiwi-pycon-2023/ 130 | 131 | 132 | https://pythondeadlin.es/conference/pygotham-tv-2023/ 133 | 134 | 135 | https://pythondeadlin.es/conference/djangocon-us-2023/ 136 | 137 | 138 | https://pythondeadlin.es/conference/pycon-australia-2023/ 139 | 140 | 141 | https://pythondeadlin.es/conference/euroscipy-2023/ 142 | 143 | 144 | https://pythondeadlin.es/conference/pycon-korea-2023/ 145 | 146 | 147 | https://pythondeadlin.es/conference/djangocon-australia-2023/ 148 | 149 | 150 | https://pythondeadlin.es/conference/pycon-estonia-2023/ 151 | 152 | 153 | https://pythondeadlin.es/conference/pycon-latin-america-2023/ 154 | 155 | 156 | https://pythondeadlin.es/conference/pycon-uganda-2023/ 157 | 158 | 159 | https://pythondeadlin.es/conference/pycon-israel-2023/ 160 | 161 | 162 | https://pythondeadlin.es/conference/pycon-taiwan-2023/ 163 | 164 | 165 | https://pythondeadlin.es/conference/pycon-poland-2023/ 166 | 167 | 168 | https://pythondeadlin.es/conference/europython-2023/ 169 | 170 | 171 | https://pythondeadlin.es/conference/pycon-russia-2023/ 172 | 173 | 174 | https://pythondeadlin.es/conference/scipy-2023/ 175 | 176 | 177 | https://pythondeadlin.es/conference/pyjamas-conf-2023/ 178 | 179 | 180 | https://pythondeadlin.es/conference/moscow-python-conf-2023/ 181 | 182 | 183 | https://pythondeadlin.es/conference/pycon-colombia-2023/ 184 | 185 | 186 | https://pythondeadlin.es/conference/pyday-la-paz-2023/ 187 | 188 | 189 | https://pythondeadlin.es/conference/pycon-lithuania-2023/ 190 | 191 | 192 | https://pythondeadlin.es/conference/pydata-london-2023/ 193 | 194 | 195 | https://pythondeadlin.es/conference/djangocon-europe-2023/ 196 | 197 | 198 | https://pythondeadlin.es/conference/pydata-seattle-2023/ 199 | 200 | 201 | https://pythondeadlin.es/conference/pycon-namibia-2023/ 202 | 203 | 204 | https://pythondeadlin.es/conference/pycon-italia-2023/ 205 | 206 | 207 | https://pythondeadlin.es/conference/pytexas-2023/ 208 | 209 | 210 | https://pythondeadlin.es/conference/pycon-france-2023/ 211 | 212 | 213 | https://pythondeadlin.es/conference/pycon-germany--pydata-berlin-2023/ 214 | 215 | 216 | https://pythondeadlin.es/conference/pycon-de--pydata-berlin-2023/ 217 | 218 | 219 | https://pythondeadlin.es/conference/pycon-philippines-2023/ 220 | 221 | 222 | https://pythondeadlin.es/conference/jupytercon-2023/ 223 | 224 | 225 | https://pythondeadlin.es/conference/geopython-2023/ 226 | 227 | 228 | https://pythondeadlin.es/conference/fosdem-2023/ 229 | 230 | 231 | https://pythondeadlin.es/conference/pycon-us-2023/ 232 | 233 | 234 | https://pythondeadlin.es/conference/pycascades-2023/ 235 | 236 | 237 | https://pythondeadlin.es/conference/python-web-conf-2023/ 238 | 239 | 240 | https://pythondeadlin.es/conference/pyjamas-conf-2022/ 241 | 242 | 243 | https://pythondeadlin.es/conference/pydata-global-2022/ 244 | 245 | 246 | https://pythondeadlin.es/conference/pydata-tel-aviv-2022/ 247 | 248 | 249 | https://pythondeadlin.es/conference/pycon-sweden-2022/ 250 | 251 | 252 | https://pythondeadlin.es/conference/pycon-ireland-2022/ 253 | 254 | 255 | https://pythondeadlin.es/conference/pydata-nyc-2022/ 256 | 257 | 258 | https://pythondeadlin.es/conference/pycon-za-2022/ 259 | 260 | 261 | https://pythondeadlin.es/conference/pycon-poland-2022/ 262 | 263 | 264 | https://pythondeadlin.es/conference/pydata-miami-2022/ 265 | 266 | 267 | https://pythondeadlin.es/conference/pycon-ghana-2022/ 268 | 269 | 270 | https://pythondeadlin.es/conference/python-at-scale-2022/ 271 | 272 | 273 | https://pythondeadlin.es/conference/scipy-latin-america-2022/ 274 | 275 | 276 | https://pythondeadlin.es/conference/pycon-korea-2022/ 277 | 278 | 279 | https://pythondeadlin.es/conference/pycon-brasil-2022/ 280 | 281 | 282 | https://pythondeadlin.es/conference/pycon-uk-2022/ 283 | 284 | 285 | https://pythondeadlin.es/conference/pycon-portugal-2022/ 286 | 287 | 288 | https://pythondeadlin.es/conference/pycon-slovakia-2022/ 289 | 290 | 291 | https://pythondeadlin.es/conference/pydata-yerevan-2022/ 292 | 293 | 294 | https://pythondeadlin.es/conference/pybay-2022/ 295 | 296 | 297 | https://pythondeadlin.es/conference/euroscipy-2022/ 298 | 299 | 300 | https://pythondeadlin.es/conference/pycon-japan-2022/ 301 | 302 | 303 | https://pythondeadlin.es/conference/djangocon-us-2022/ 304 | 305 | 306 | https://pythondeadlin.es/conference/djangocon-europe-2022/ 307 | 308 | 309 | https://pythondeadlin.es/conference/pycones-2022/ 310 | 311 | 312 | https://pythondeadlin.es/conference/pycon-lt-2022/ 313 | 314 | 315 | https://pythondeadlin.es/conference/pycon-colombia-2022/ 316 | 317 | 318 | https://pythondeadlin.es/conference/pycon-israel-2022/ 319 | 320 | 321 | https://pythondeadlin.es/conference/pycon-apac-2022/ 322 | 323 | 324 | https://pythondeadlin.es/conference/pycon-kenya-conference-2022/ 325 | 326 | 327 | https://pythondeadlin.es/conference/europython-2022/ 328 | 329 | 330 | https://pythondeadlin.es/conference/pycon-estonia-2022/ 331 | 332 | 333 | https://pythondeadlin.es/conference/geopython-2022/ 334 | 335 | 336 | https://pythondeadlin.es/conference/scipy-us-2022/ 337 | 338 | 339 | https://pythondeadlin.es/conference/pycon-iran-2022/ 340 | 341 | 342 | https://pythondeadlin.es/conference/pycon-italy-2022/ 343 | 344 | 345 | https://pythondeadlin.es/conference/pycon-de--pydata-berlin-2022/ 346 | 347 | 348 | https://pythondeadlin.es/conference/scipy-india-2021/ 349 | 350 | 351 | https://pythondeadlin.es/conference/pycon-us-2022/ 352 | 353 | 354 | https://pythondeadlin.es/conference/kiwi-pycon-xi-2022/ 355 | 356 | 357 | https://pythondeadlin.es/conference/python-web-conf-2022/ 358 | 359 | 360 | https://pythondeadlin.es/conference/pycascades-remote-2022/ 361 | 362 | 363 | https://pythondeadlin.es/conference/euroscipy-2019/ 364 | 365 | 366 | -------------------------------------------------------------------------------- /feed.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | 9 | Python Conference Deadlines 10 | Countdowns to your favourite Python conferences with calls for participation and resources to submit awesome talks! 11 | https://pythondeadlin.es/feed.xml 12 | Wed, 09 Aug 2023 19:14:36 +0000 13 | 14 | 15 | 16 | PyHEP 2023 Conference Deadline 17 | Conference in Online on October 09 - 12, 2023. CfP: 2023-09-06 23:59:00 AoE.<br />Find them here: @PyHEPConf 18 | Wed, 06 Sep 2023 23:59:00 +0000 19 | https://pythondeadlin.es/conference/pyhep-2023/ 20 | 21 | SCIPY 22 | 23 | 24 | 25 | 26 | 27 | PyLadiesCon 2023 Conference Deadline 28 | Conference in Online on December 02 - 03, 2023. CfP: 2023-09-04 23:59:00 AoE. 29 | Mon, 04 Sep 2023 23:59:00 +0000 30 | https://pythondeadlin.es/conference/pyladiescon-2023/ 31 | 32 | PY 33 | 34 | 35 | 36 | 37 | 38 | PyCon Sweden 2023 Conference Deadline 39 | Conference in Stockholm, Sweden on November 09 - 10, 2023. CfP: 2023-09-01 23:59:00 AoE.<br />Find them here: @pyconse 40 | Fri, 01 Sep 2023 23:59:00 +0000 41 | https://pythondeadlin.es/conference/pycon-sweden-2023/ 42 | 43 | PY 44 | 45 | 46 | 47 | 48 | 49 | PyCon South Africa 2023 Conference Deadline 50 | Conference in Durban, South Africa on October 5 - 6, 2023. CfP: 2023-08-18 23:59:00 AoE.<br />Find them here: @pyconza 51 | Fri, 18 Aug 2023 23:59:00 +0000 52 | https://pythondeadlin.es/conference/pycon-south-africa-2023/ 53 | 54 | PY 55 | 56 | 57 | 58 | 59 | 60 | PyCon Thailand 2023 Conference Deadline 61 | Conference in Bangkok, Thailand on December 14 - 16, 2023. CfP: 2023-08-16 23:59:00 AoE. 62 | Wed, 16 Aug 2023 23:59:00 +0000 63 | https://pythondeadlin.es/conference/pycon-thailand-2023/ 64 | 65 | PY 66 | 67 | 68 | 69 | 70 | 71 | PyCon India 2023 Conference Deadline 72 | Conference in Hyderabad, India on 29 September - 2 October, 2023. CfP: 2023-08-05 23:59:00 AoE.<br />Find them here: @PyConIndia 73 | Sat, 05 Aug 2023 23:59:00 +0000 74 | https://pythondeadlin.es/conference/pycon-india-2023/ 75 | 76 | PY 77 | 78 | 79 | 80 | 81 | 82 | PyCon Ireland 2023 Conference Deadline 83 | Conference in Dublin, Ireland on November 11 - 12, 2023. CfP: 2023-07-16 23:59:00 AoE. 84 | Sun, 16 Jul 2023 23:59:00 +0000 85 | https://pythondeadlin.es/conference/pycon-ireland-2023/ 86 | 87 | PY 88 | 89 | 90 | 91 | 92 | 93 | PyCon Indonesia 2023 Conference Deadline 94 | Conference in Badung City, Indonesia on November 18 - 19, 2023. CfP: 2023-07-15 16:59:59 AoE.<br />Find them here: @id_pycon 95 | Sat, 15 Jul 2023 16:59:59 +0000 96 | https://pythondeadlin.es/conference/pycon-indonesia-2023/ 97 | 98 | PY 99 | 100 | 101 | 102 | 103 | 104 | PyData Tel Aviv 2023 Conference Deadline 105 | Conference in Tel Aviv, Israel on November 14th, 2023. CfP: 2023-07-14 23:59:00 AoE.<br />Find them here: @PyDataTLV 106 | Fri, 14 Jul 2023 23:59:00 +0000 107 | https://pythondeadlin.es/conference/pydata-tel-aviv-2023/ 108 | 109 | PYDATA 110 | 111 | 112 | 113 | 114 | 115 | DjangoCon Africa 2023 Conference Deadline 116 | Conference in Zanzibar, Tanzania on November 06 - 11, 2023. CfP: 2023-07-12 23:59:00 AoE.<br />Find them here: @djcafrica 117 | Wed, 12 Jul 2023 23:59:00 +0000 118 | https://pythondeadlin.es/conference/djangocon-africa-2023/ 119 | 120 | WEB 121 | 122 | 123 | 124 | 125 | 126 | Swiss Python Summit 2023 Conference Deadline 127 | Conference in Rapperswil, Switzerland on September 21, 2023. CfP: 2023-07-01 23:59:00 AoE.<br />Find them here: @pythonsummit 128 | Sat, 01 Jul 2023 23:59:00 +0000 129 | https://pythondeadlin.es/conference/swiss-python-summit-2023/ 130 | 131 | PY 132 | 133 | 134 | 135 | 136 | 137 | PyCon Portugal 2023 Conference Deadline 138 | Conference in Coimbra, Coimbra, Portugal on September 07 - 09, 2023. CfP: 2023-06-30 23:59:00 AoE.<br />Find them here: @PyConPT 139 | Fri, 30 Jun 2023 23:59:00 +0000 140 | https://pythondeadlin.es/conference/pycon-portugal-2023/ 141 | 142 | PY 143 | 144 | 145 | 146 | 147 | 148 | PyCon UK 2023 Conference Deadline 149 | Conference in Cardiff, UK on September 22 - 25, 2023. CfP: 2023-06-30 16:59:00 AoE.<br />Find them here: @PyConUK 150 | Fri, 30 Jun 2023 16:59:00 +0000 151 | https://pythondeadlin.es/conference/pycon-uk-2023/ 152 | 153 | PY 154 | 155 | 156 | 157 | 158 | 159 | PyCon CZ 2023 Conference Deadline 160 | Conference in Prague, Bohemia, Czechia on September 15 - 17, 2023. CfP: 2023-06-25 23:59:00 AoE.<br />Find them here: @pyconcz 161 | Sun, 25 Jun 2023 23:59:00 +0000 162 | https://pythondeadlin.es/conference/pycon-cz-2023/ 163 | 164 | PY 165 | 166 | 167 | 168 | 169 | 170 | PyCon España 2023 Conference Deadline 171 | Conference in Tenerife, Spain on October 06 - 08, 2023. CfP: 2023-06-23 23:59:00 AoE.<br />Find them here: @PyConES 172 | Fri, 23 Jun 2023 23:59:00 +0000 173 | https://pythondeadlin.es/conference/pycon-españa-2023/ 174 | 175 | PY 176 | 177 | 178 | 179 | 180 | 181 | AfroPython Conf 2023 Conference Deadline 182 | Conference in Salvador, Brazil on July 22, 2023. CfP: 2023-06-19 23:59:00 AoE.<br />Find them here: @AfroPython 183 | Mon, 19 Jun 2023 23:59:00 +0000 184 | https://pythondeadlin.es/conference/afropython-conf-2023/ 185 | 186 | PY 187 | 188 | 189 | 190 | 191 | 192 | PyCon Hong Kong 2023 Conference Deadline 193 | Conference in Hong Kong on November 10 - 11, 2023 (tentative). CfP: 2023-06-18 23:59:00 AoE.<br />Find them here: @pyconhk 194 | Sun, 18 Jun 2023 23:59:00 +0000 195 | https://pythondeadlin.es/conference/pycon-hong-kong-2023/ 196 | 197 | PY 198 | 199 | 200 | 201 | 202 | 203 | PyData Amsterdam 2023 Conference Deadline 204 | Conference in Amsterdam, Netherlands on September 14 - 16, 2023. CfP: 2023-06-11 23:59:00 AoE. 205 | Sun, 11 Jun 2023 23:59:00 +0000 206 | https://pythondeadlin.es/conference/pydata-amsterdam-2023/ 207 | 208 | PYDATA 209 | 210 | 211 | 212 | 213 | 214 | Python Brasil 2023 Conference Deadline 215 | Conference in Serra Gaúcha, Rio Grande do Sul, Brazil on October 30 - November 05, 2023. CfP: 2023-06-08 23:59:00 AoE.<br />Find them here: @PyConBrasil 216 | Thu, 08 Jun 2023 23:59:00 +0000 217 | https://pythondeadlin.es/conference/python-brasil-2023/ 218 | 219 | PY 220 | 221 | 222 | 223 | 224 | 225 | PyCon Asia Pacific 2023 Conference Deadline 226 | Conference in Tokyo, Japan on October 27 - 29, 2023. CfP: 2023-05-31 23:59:59 AoE. 227 | Wed, 31 May 2023 23:59:59 +0000 228 | https://pythondeadlin.es/conference/pycon-asia-pacific-2023/ 229 | 230 | PY 231 | 232 | 233 | 234 | 235 | 236 | PyCon MEA @GlobalDevSlam 2023 Conference Deadline 237 | Conference in Dubai, UAE on October 16 - 20, 2023. CfP: 2023-05-31 23:59:00 AoE.<br />Find them here: @GlobalDevSlam 238 | Wed, 31 May 2023 23:59:00 +0000 239 | https://pythondeadlin.es/conference/pycon-mea-globaldevslam-2023/ 240 | 241 | PY 242 | 243 | 244 | 245 | 246 | 247 | PyCon Malaysia 2023 Conference Deadline 248 | Conference in Kuala Lumpur, Malaysia on August 26, 2023. CfP: 2023-05-31 23:59:00 AoE.<br />Find them here: @pyconmy 249 | Wed, 31 May 2023 23:59:00 +0000 250 | https://pythondeadlin.es/conference/pycon-malaysia-2023/ 251 | 252 | PY 253 | 254 | 255 | 256 | 257 | 258 | North Bay Python 2023 Conference Deadline 259 | Conference in Petaluma, California, USA on July 29 - 30, 2023. CfP: 2023-05-19 23:59:00 AoE.<br />Find them here: @NorthBayPython 260 | Fri, 19 May 2023 23:59:00 +0000 261 | https://pythondeadlin.es/conference/north-bay-python-2023/ 262 | 263 | PY 264 | 265 | 266 | 267 | 268 | -------------------------------------------------------------------------------- /utils/import_python_organizers.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | import pandas as pd 3 | import urllib 4 | import yaml 5 | import sys 6 | from thefuzz import process, fuzz 7 | from pathlib import Path 8 | 9 | sys.path.append(".") 10 | from utils import ordered_dump, get_schema, query_yes_no 11 | 12 | 13 | def load_remote(year): 14 | template = "https://raw.githubusercontent.com/python-organizers/conferences/main/{year}.csv" 15 | url = template.format(year=year) 16 | 17 | # Read data and rename columns 18 | df = pd.read_csv(url) 19 | df = map_columns(df) 20 | 21 | # Only return valid cfps 22 | # return df.dropna(subset=['cfp']) 23 | return df 24 | 25 | 26 | def load_yml(): 27 | schema = get_schema() 28 | 29 | # Load the YAML file 30 | with open("_data/conferences.yml", "r") as file: 31 | data = yaml.load(file, Loader=yaml.FullLoader) 32 | with open("_data/archive.yml", "r") as file: 33 | archive = yaml.load(file, Loader=yaml.FullLoader) 34 | 35 | # Convert the YAML data to a Pandas DataFrame 36 | return pd.concat( 37 | [schema, pd.DataFrame.from_dict(data), pd.DataFrame.from_dict(archive)], 38 | ignore_index=True, 39 | ).set_index("title", drop=False) 40 | 41 | 42 | def map_columns(df, reverse=False): 43 | cols = { 44 | "Subject": "title", 45 | "Start Date": "start", 46 | "End Date": "end", 47 | "Tutorial Deadline": "tutorial_deadline", 48 | "Talk Deadline": "cfp", 49 | "Website URL": "link", 50 | "Proposal URL": "cfp_link", 51 | "Sponsorship URL": "sponsor", 52 | } 53 | 54 | df["place"] = df["Location"] 55 | 56 | if reverse: 57 | cols = {v: k for k, v in cols.items()} 58 | 59 | return df.rename(columns=cols) 60 | 61 | 62 | def fuzzy_match(df_yml, df_remote): 63 | # Make Title the index 64 | df_remote = df_remote.set_index("title", drop=False) 65 | df_remote.index.rename("title_match", inplace=True) 66 | known_mappings = {"SciPy US": "SciPy"} 67 | 68 | df = df_yml.copy() 69 | 70 | # Get closest match for titles 71 | df["title_match"] = df["title"].apply(lambda x: process.extract(x, df_remote["title"], limit=1)) 72 | 73 | for key, value in known_mappings.items(): 74 | if key in df["title"].values: 75 | df.loc[df["title"] == key, "title_match"] = value 76 | 77 | # Get first match if it's over 90 78 | for i, row in df.copy().iterrows(): 79 | if isinstance(row["title_match"], str): 80 | continue 81 | title, prob, _ = row["title_match"][0] 82 | if prob == 100: 83 | title = title 84 | elif prob >= 70: 85 | if not query_yes_no(f"Do '{row['title']}' and '{title}' match? (y/n): "): 86 | # Code for non-matching case 87 | title = i 88 | else: 89 | title = i 90 | df.loc[i, "title_match"] = title 91 | 92 | df.set_index("title_match", inplace=True) 93 | print(df) 94 | # Update missing data in existing records 95 | df_new = df.combine_first(df_remote) 96 | 97 | df_new.loc[df_new["cfp"].isna(), "cfp"] = "TBA" 98 | 99 | print(df_new, df_remote) 100 | 101 | return df_new, df_remote 102 | 103 | 104 | def interactive_merge(df_yml, df_remote): 105 | df_new = get_schema() 106 | columns = df_new.columns.tolist() 107 | 108 | try: 109 | df_yml = df_yml.drop(["title"], axis=1) 110 | except: 111 | pass 112 | try: 113 | df_remote = df_remote.drop(["title"], axis=1) 114 | except: 115 | pass 116 | 117 | replacements = { 118 | "United States of America": "USA", 119 | "United States": "USA", 120 | "United Kingdom": "UK", 121 | "Czech Republic": "Czechia", 122 | "www.": "", 123 | } 124 | 125 | df_merge = pd.merge(left=df_yml, right=df_remote, how="outer", on="title_match", validate="one_to_one") 126 | for i, row in df_merge.iterrows(): 127 | df_new.loc[i, "title"] = i 128 | for column in columns: 129 | cx, cy = column + "_x", column + "_y" 130 | # print(i,cx,cy,cx in df_merge.columns and cy in df_merge.columns,column in df_merge.columns,) 131 | if cx in df_merge.columns and cy in df_merge.columns: 132 | rx, ry = row[cx], row[cy] 133 | for orig, replacement in replacements.items(): 134 | if isinstance(rx, str): 135 | rx = rx.replace(orig, replacement) 136 | if isinstance(ry, str): 137 | ry = ry.replace(orig, replacement) 138 | # Prefer my sponsor info if exists 139 | if column == "sponsor": 140 | if not pd.isnull(rx): 141 | ry = rx 142 | # Some text processing 143 | if isinstance(rx, str) and isinstance(ry, str): 144 | # Remove whitespaces 145 | rx, ry = str.strip(rx), str.strip(ry) 146 | # Look at strings with extra information 147 | if rx.split(" ")[0] == ry.split(" ")[0] and rx.split(" ")[-1] == ry.split(" ")[-1]: 148 | if len(ry) > len(rx): 149 | df_new.loc[i, column] = rx 150 | ry = rx 151 | else: 152 | df_new.loc[i, column] = ry 153 | rx = ry 154 | # Partial strings such as CFP 155 | if rx.startswith(ry): 156 | ry = rx 157 | elif ry.startswith(rx): 158 | rx = ry 159 | if rx.endswith(ry): 160 | rx = ry 161 | elif ry.endswith(rx): 162 | ry = rx 163 | if "Online" in [rx, ry]: 164 | ry, rx = "Online", "Online" 165 | if rx == ry: 166 | # When both are equal just assign 167 | df_new.loc[i, column] = rx 168 | elif pd.isnull(rx) and ry: 169 | # If one is empty use the other 170 | df_new.loc[i, column] = ry 171 | elif rx and pd.isnull(ry): 172 | # If one is empty use the other 173 | df_new.loc[i, column] = rx 174 | elif type(rx) != type(ry): 175 | # Use non-string on different types 176 | if str(rx).strip() == str(ry).strip(): 177 | if isinstance(rx, str): 178 | df_new.loc[i, column] = ry 179 | rx = ry 180 | elif isinstance(ry, str): 181 | df_new.loc[i, column] = rx 182 | ry = rx 183 | else: 184 | if query_yes_no(f"For {i} in column '{column}' would you prefer '{rx}' or keep '{ry}'?"): 185 | df_new.loc[i, column] = rx 186 | else: 187 | df_new.loc[i, column] = ry 188 | elif column == "cfp" and rx != ry: 189 | # Special CFP stuff 190 | cfp_time_x = cfp_time_y = "" 191 | if " " in rx and " " not in ry: 192 | cfp_time_y = " " + rx.split(" ")[1] 193 | elif " " not in rx and " " in ry: 194 | cfp_time_x = " " + ry.split(" ")[1] 195 | if query_yes_no( 196 | f"For {i} in column '{column}' would you prefer '{rx+ cfp_time_x}' or keep '{ry+cfp_time_y}'?" 197 | ): 198 | df_new.loc[i, column] = rx + cfp_time_x 199 | else: 200 | df_new.loc[i, column] = ry + cfp_time_y 201 | else: 202 | # For everything else give a choice 203 | if query_yes_no(f"For {i} in column '{column}' would you prefer '{rx}' or keep '{ry}'?"): 204 | df_new.loc[i, column] = rx 205 | else: 206 | df_new.loc[i, column] = ry 207 | elif column in df_merge.columns: 208 | df_new[column] = df_merge[column] 209 | 210 | df_new.loc[df_new.cfp.isna(), "cfp"] = "TBA" 211 | return df_new 212 | 213 | 214 | def fill_missing_required(df): 215 | required = [ 216 | "title", 217 | "year", 218 | "link", 219 | "cfp", 220 | "timezone", 221 | "place", 222 | "start", 223 | "end", 224 | "sub", 225 | ] 226 | 227 | for i, row in df.copy().iterrows(): 228 | for keyword in required: 229 | if pd.isna(row[keyword]): 230 | user_input = input( 231 | f"What's the value of '{keyword}' for conference '{row['title']}' check {row['link']} ?: " 232 | ) 233 | if user_input != "": 234 | df.loc[i, keyword] = user_input 235 | return df 236 | 237 | 238 | def write_yaml(df, out_url): 239 | try: 240 | df = df.drop(["Country", "Venue"], axis=1) 241 | except KeyError: 242 | pass 243 | df["end"] = pd.to_datetime(df["end"]).dt.date 244 | df["start"] = pd.to_datetime(df["start"]).dt.date 245 | df["year"] = df["year"].astype(int) 246 | df["cfp"] = df["cfp"].astype(str) 247 | with open(out_url, "w") as outfile: 248 | for line in ordered_dump( 249 | [{k: v for k, v in record.items() if pd.notnull(v)} for record in df.to_dict(orient="records")], 250 | Dumper=yaml.SafeDumper, 251 | default_flow_style=False, 252 | explicit_start=True, 253 | ).splitlines(): 254 | outfile.write(line.replace("- title:", "\n- title:")) 255 | outfile.write("\n") 256 | 257 | 258 | def write_csv(df, year, csv_location): 259 | df["cfp"] = df["cfp"].str.slice(stop=10).str.replace("TBA", "") 260 | df["tutorial_deadline"] = df["tutorial_deadline"].str.slice(stop=10).str.replace("TBA", "") 261 | df = map_columns(df, reverse=True) 262 | for y in range(year, datetime.now().year + 10): 263 | if y in df["year"].unique(): 264 | df.loc[ 265 | df["year"] == y, 266 | [ 267 | "Subject", 268 | "Start Date", 269 | "End Date", 270 | "Location", 271 | "Country", 272 | "Venue", 273 | "Tutorial Deadline", 274 | "Talk Deadline", 275 | "Website URL", 276 | "Proposal URL", 277 | "Sponsorship URL", 278 | ], 279 | ].fillna("").astype(str).sort_values(by="Start Date").to_csv(Path(csv_location, f"{y}.csv"), index=False) 280 | 281 | 282 | def main(year=None, base=""): 283 | target_file = Path(base, "_data", "conferences.yml") 284 | csv_location = Path(base, "utils", "conferences") 285 | 286 | if year is None: 287 | year = datetime.now().year 288 | 289 | df_yml = load_yml() 290 | df_new = pd.DataFrame(columns=df_yml.columns) 291 | df_csv = pd.DataFrame(columns=df_yml.columns) 292 | 293 | for y in range(year, datetime.now().year + 10): 294 | try: 295 | df = load_remote(year=y) 296 | except urllib.error.HTTPError: 297 | break 298 | 299 | df_merged, df_remote = fuzzy_match(df_yml[df_yml["year"] == y], df) 300 | df_merged["year"] = y 301 | df_merged = df_merged.drop(["title"], axis=1) 302 | df_merged = interactive_merge(df_merged, df_remote) 303 | 304 | df_new = pd.concat([df_new, df_merged], ignore_index=True) 305 | 306 | merged, _ = fuzzy_match(df, df_yml[df_yml["year"] == y]) 307 | df_csv = pd.concat([df_csv, merged], ignore_index=True) 308 | 309 | df_new = fill_missing_required(df_new) 310 | write_yaml(df_new, target_file) 311 | 312 | df_csv.loc[:, "Location"] = df_csv.place 313 | write_csv(df_csv, year, csv_location) 314 | 315 | 316 | if __name__ == "__main__": 317 | main() 318 | -------------------------------------------------------------------------------- /resources/what-about/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | What should my Python conference talk be about? 8 | 9 | 10 | What should my Python conference talk be about? | Python Conference 11 | Deadlines 12 | 13 | 14 | 18 | 19 | 20 | 24 | 28 | 32 | 36 | 37 | 38 | 42 | 43 | 47 | 48 | 49 | 65 | 66 | 67 | 73 | 74 | 80 | 81 | 86 | 92 | 98 | 99 | 100 | 101 | 150 | 151 | 156 | 160 | 161 | 162 | 163 | 167 | 168 | 169 | 170 | 174 | 175 | 176 | 241 |
242 | 255 |
256 |

257 | We often get a paradox conundrum when we finally decide to give a talk 258 | at a Python conference. We learned about so many exciting things. So 259 | much is interesting. But what should my Python talk be about?! 260 |

261 | 262 |

263 | So, Congratulations on deciding to present on Python! You’re eager to 264 | share your knowledge and experience with others. Let’s dive in! 265 |

266 | 267 |

268 | First things first, think about your audience. Who do you want to 269 | attend your talk? Are they beginners, intermediate or advanced Python 270 | users? Do they have a specific interest or problem they want to solve 271 | using Python? Understanding your audience’s expertise and interest 272 | will help you decide on a topic that will appeal to them and keep them 273 | engaged. 274 |

275 | 276 |

277 | Next, consider the type of talk you want to give. Do you want to dive 278 | deep into a complex topic or keep it simple with a hands-on tutorial? 279 | Do you want to focus on Python’s mathematical capabilities or 280 | practical applications? It’s crucial to pick a topic that aligns with 281 | your expertise and passion and keeps your audience in mind. 282 |

283 | 284 |

285 | Once you’ve decided on your topic and type of talk, think about the 286 | tone you want to set. Do you want to be light-hearted and funny or 287 | more severe and cautionary? There’s no right or wrong answer here, but 288 | ensure your tone is appropriate for your topic and audience. 289 |

290 | 291 |

292 | Remember, your talk aims to educate and inspire others about Python, 293 | so make sure your takeaways are clear and valuable. What should your 294 | audience learn or take away from your talk? How can they apply what 295 | they’ve learned in their Python projects or careers? 296 |

297 | 298 |

299 | In summary, when deciding on the topic of your Python talk, consider 300 | your audience, the type of talk, and the tone you want to set. Make 301 | sure your takeaways are clear and valuable to your audience. And most 302 | importantly, have fun and share your passion for Python with others! 303 |

304 |
305 | 339 |

340 |
341 | 342 | 343 | -------------------------------------------------------------------------------- /conference/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | What is a Python conference? 8 | 9 | What is a Python conference? | Python Conference Deadlines 10 | 11 | 12 | 13 | 14 | 18 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 40 | 41 | 42 | 48 | 49 | 55 | 56 | 61 | 67 | 73 | 74 | 75 | 76 | 125 | 126 | 131 | 135 | 136 | 137 | 138 | 142 | 143 | 144 | 145 | 149 | 150 | 151 | 216 |
217 | 230 |
231 |

232 | Python is an incredibly popular programming language, with millions of 233 | developers building all sorts of software applications. 234 |

235 | 236 |

237 | As a result, there are many Python conferences around the world, where 238 | people gather to share their knowledge, learn from each other, and 239 | explore the latest trends in the Python ecosystem. 240 |

241 | 242 |

243 | Attending a Python conference can be an incredible experience for 244 | developers as they meet other like-minded individuals, learn about new 245 | technologies and best practices, and gain inspiration for their next 246 | projects. Conferences also provide an opportunity for attendees to 247 | network with others in the field, which can lead to new job 248 | opportunities, collaborations, and friendships. 249 |

250 | 251 |

252 | But attending a conference is just one part of the experience - 253 | presenting at one is an entirely different ballgame. Speaking at a 254 | conference is a great way to showcase your expertise, build your 255 | personal brand, and share your ideas with a broader audience. It’s 256 | also a chance to challenge yourself to become a better communicator 257 | and improve your public speaking skills. 258 |

259 | 260 |

261 | Suppose you’re interested in presenting at a Python conference. In 262 | that case, plenty of resources are out there to help you get started. 263 | One such resource is PythonDeadlines, a website aggregating calls for 264 | participation (CFPs) for various Python conferences worldwide. By 265 | keeping track of these deadlines, Pythonistas can ensure they don’t 266 | miss out on any opportunities to present at conferences. 267 |

268 | 269 |

270 | There are many benefits to presenting at a Python conference. First 271 | and foremost, it can be a gratifying experience to share your 272 | knowledge and ideas with others in the community. It’s also a great 273 | way to establish yourself as an authority in your field, which can 274 | lead to new job opportunities, speaking engagements, and other 275 | professional opportunities. And, of course, presenting at a conference 276 | can be a lot of fun. There’s nothing quite like being on stage and 277 | sharing your passion with a room full of people just as passionate 278 | about Python as you are. 279 |

280 | 281 |

282 | Another benefit of presenting at a conference is that it can be a 283 | great way to get feedback on your work. Whether you’re introducing a 284 | new library you’ve built or sharing some best practices you’ve 285 | developed, the feedback you receive from other attendees can be 286 | precious in helping you refine your ideas and improve your work. 287 |

288 | 289 |

290 | In conclusion, attending a Python conference can be a fantastic 291 | experience for developers, but presenting at one can take that 292 | experience to the next level. With resources like PythonDeadlines to 293 | help you keep track of CFPs, there’s never been a better time to 294 | consider submitting a proposal for your next Python conference. 295 |

296 | 297 |

So why not give it a try?

298 | 299 |

300 | You might just find that it’s one of the most rewarding experiences of 301 | your career. 302 |

303 |
304 | 338 |

339 |
340 | 341 | 342 | -------------------------------------------------------------------------------- /resources/what-are-python-cfps/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | What is a Python conference CfP? 8 | 9 | 10 | What is a Python conference CfP? | Python Conference Deadlines 11 | 12 | 13 | 14 | 15 | 16 | 20 | 24 | 28 | 32 | 33 | 34 | 38 | 39 | 40 | 41 | 42 | 58 | 59 | 60 | 66 | 67 | 73 | 74 | 79 | 85 | 91 | 92 | 93 | 94 | 143 | 144 | 149 | 153 | 154 | 155 | 156 | 160 | 161 | 162 | 163 | 167 | 168 | 169 | 234 |
235 | 248 |
249 |

250 | A Call for Proposals (CfP) or Call for Participation is a common term 251 | used in academic, research, and professional communities to invite 252 | individuals or groups to submit proposals or abstracts for 253 | conferences, workshops, symposiums, and other events. 254 |

255 | 256 |

257 | Since the Python community is a bunch of lovely nerds, this same 258 | terminology made it into the Python vernacular. 259 |

260 | 261 |

What’s a CfP?

262 |

263 | In simple terms, a CfP is an open invitation to experts, scholars, 264 | researchers, and practitioners to present their ideas, research 265 | findings, and case studies in a particular field or area of interest. 266 |

267 | 268 |

269 | A CfP is typically issued by event organizers, conference committees, 270 | or academic institutions to solicit submissions from interested 271 | individuals or groups. 272 |

273 | 274 |

What are CfPs for?

275 |

276 | The purpose of a CfP is to encourage a broad range of participants to 277 | engage with an event or a conference, ensuring a diversity of 278 | perspectives and ideas. 279 |

280 | 281 |

282 | CfPs often outline the event’s theme, the topics of interest, and the 283 | submission guidelines. They also specify the types of submissions that 284 | are accepted, such as research papers, case studies, posters, or 285 | workshops. 286 |

287 | 288 |

289 | How do you participate in a CfP? 290 |

291 |

292 | The submission process for a CfP typically involves preparing a 293 | proposal or abstract that includes a summary of the proposed topic, 294 | the research methodology or approach, and the expected outcomes. 295 |

296 | 297 |

298 | Some academic CfPs may require a full paper submission, while others 299 | may ask for a short abstract or a summary. 300 |

301 | 302 |

303 | Python CfPs rarely require the submission of full materials, as they 304 | do not publish papers. However, it is vital to avoid the 305 | common pitfall of promising 306 | solely future work. 307 |

308 | 309 |

Conclusion

310 | 311 |

312 | In summary, a CfP invites experts, scholars, researchers, and 313 | practitioners to submit proposals or abstracts for an event or 314 | conference. 315 |

316 | 317 |

318 | It plays a vital role in facilitating the sharing of knowledge and 319 | expertise, promoting discussions, and creating opportunities for 320 | networking among professionals in a particular field. 321 |

322 | 323 |

324 | If you are interested in attending or presenting at a conference or 325 | event, 326 | keep an eye out for CfPs! 327 |

328 |
329 | 363 |

364 |
365 | 366 | 367 | -------------------------------------------------------------------------------- /resources/good-conference-talk-proposals/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | How to write a great Python Conference Talk Proposal 8 | 9 | 10 | How to write a great Python Conference Talk Proposal | Python Conference 11 | Deadlines 12 | 13 | 14 | 18 | 19 | 20 | 24 | 28 | 32 | 36 | 37 | 38 | 42 | 43 | 47 | 48 | 49 | 65 | 66 | 67 | 73 | 74 | 80 | 81 | 86 | 92 | 98 | 99 | 100 | 101 | 150 | 151 | 156 | 160 | 161 | 162 | 163 | 167 | 168 | 169 | 170 | 174 | 175 | 176 | 241 |
242 | 256 |
257 |

258 | Writing a good conference proposal can be challenging. Still, some key 259 | elements can help make your proposal stand out. Here are five 260 | essential components of a successful conference proposal. 261 |

262 | 263 |

264 | The topic and why it’s interesting 265 |

266 |

267 | The first component of a good conference proposal is a clear and 268 | compelling description of the topic you plan to discuss. Communicating 269 | why your topic is relevant and exciting to the conference audience is 270 | essential. Be sure to highlight any unique or innovative aspects of 271 | your topic and any challenges or opportunities it presents. 272 |

273 | 274 |

277 | The audience that will benefit from attending this talk/tutorial 278 |

279 |

280 | Identifying your 281 | target audience is 282 | crucial in creating a successful conference proposal. 283 |

284 | 285 |

286 | Be specific about who will benefit from your talk or tutorial and what 287 | they will learn. 288 |

289 | 290 |

291 | Understanding your audience will help you tailor your content and 292 | ensure that you’re providing valuable insights and takeaways. 293 |

294 | 295 |

296 | The takeaway for the audience 297 |

298 |

299 | What can attendees expect to gain from your talk or tutorial? Be clear 300 | about the key takeaways you hope to provide. 301 |

302 | 303 |

304 | This will help attendees evaluate whether your presentation aligns 305 | with their interests and needs. 306 |

307 | 308 |

309 | It will also help you structure your talk and stay on track to deliver 310 | the promised value. 311 |

312 | 313 |

314 | Any background knowledge needed to understand the talk/tutorial 315 |

316 |

317 | When crafting your proposal, it’s important to consider what 318 | background knowledge your audience will need to understand and engage 319 | with your content. 320 |

321 | 322 |

323 | Be clear about any prerequisites, and provide links or resources that 324 | attendees can use to brush up on their knowledge before attending. 325 |

326 | 327 |

330 | Approximate time breakdowns of how the material will be covered 331 |

332 |

333 | A detailed breakdown of how you plan to cover your material is vital 334 | to help attendees understand what they can expect from your talk or 335 | tutorial. 336 |

337 | 338 |

339 | By outlining a clear structure and timeline for your presentation, you 340 | will help attendees stay engaged and focused on your content. It will 341 | also help you stay on track and cover all the key points you want to 342 | make. 343 |

344 | 345 |

Conclusion

346 |

347 | In conclusion, a good conference proposal should provide a clear and 348 | compelling description of the topic, identify the 349 | target audience and 350 | their needs, clearly communicate the takeaways and any background 351 | knowledge required, and provide a detailed breakdown of the material. 352 | Including these essential components will increase the chances of your 353 | proposal being accepted and delivering a successful presentation at 354 | the conference. 355 |

356 | 357 |

358 | This list expands on excellent points made by the 360 | Pydata Global conference. 364 |

365 |
366 | 400 |

401 |
402 | 403 | 404 | -------------------------------------------------------------------------------- /resources/how-to-get-started-talk-python-conferences/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | How to get create a fantastic presentation for Python conferences? 9 | 10 | 11 | 12 | How to get create a fantastic presentation for Python conferences? | 13 | Python Conference Deadlines 14 | 15 | 16 | 20 | 21 | 22 | 26 | 30 | 34 | 38 | 39 | 40 | 44 | 45 | 49 | 50 | 51 | 67 | 68 | 69 | 75 | 76 | 82 | 83 | 88 | 94 | 100 | 101 | 102 | 103 | 152 | 153 | 158 | 162 | 163 | 164 | 165 | 169 | 170 | 171 | 172 | 176 | 177 | 178 | 243 |
244 | 259 |
260 |

261 | Python conferences offer an excellent platform for developers to 262 | showcase their skills, share knowledge, and network with fellow 263 | professionals. 264 |

265 | 266 |

267 | Speaking at a Python conference can be a fantastic opportunity to gain 268 | recognition, build credibility, and make a valuable contribution to 269 | the Python community. However, presenting at a conference can also be 270 | daunting, especially if you are new to public speaking or have never 271 | presented before. In this resource, we will share some tips on how to 272 | speak at Python conferences and make your presentation a success. 273 |

274 | 275 |

276 | Choose a topic that you are passionate about 277 |

278 |

279 | The first step to delivering a successful presentation is choosing a 280 | topic you are passionate about. If you are excited about your topic, 281 | your enthusiasm will show in your presentation. You will be more 282 | likely to engage and captivate your audience. Pick a topic relevant to 283 | the Python community and offers valuable insights or solutions to 284 | common problems. 285 |

286 | 287 |

Understand your audience

288 |

289 | Before you start preparing your presentation, it’s essential to 290 | understand your audience’s demographics, expertise level, and 291 | interests. This will help you tailor your content and delivery to meet 292 | their expectations and needs. For example, if your audience consists 293 | of beginner Python developers, you can simplify technical jargon and 294 | focus on fundamental concepts. 295 |

296 | 297 |

298 | Create a compelling narrative 299 |

300 |

301 | A compelling narrative is a critical aspect of any successful 302 | presentation. It’s essential to structure your presentation in a way 303 | that tells a story and keeps your audience engaged. Use anecdotes, 304 | case studies, and real-life examples to help illustrate your points 305 | and add a personal touch to your presentation. Make sure to highlight 306 | and present the most critical takeaways clearly and concisely. 307 |

308 | 309 |

Practice, practice, practice

310 |

311 | Practice is vital to delivering a polished and confident presentation. 312 | Rehearse your presentation multiple times until you feel comfortable 313 | with your content and delivery. Time your presentation to ensure that 314 | it fits within the allocated time frame. Consider recording your 315 | practice sessions and reviewing them to identify improvement areas. 316 |

317 | 318 |

319 | Use visuals to support your message 320 |

321 |

322 | Visual aids like slides and diagrams can help support your message and 323 | keep your audience engaged. However, be careful not to overload your 324 | presentation with too many visuals, which can distract you from your 325 | message. Use graphics and images to illustrate complex concepts and 326 | data, and keep your slides simple and visually appealing. 327 |

328 | 329 |

Engage with your audience

330 |

331 | Engaging with your audience is a crucial aspect of a successful 332 | presentation. Encourage your audience to participate by asking 333 | questions, conducting polls, or using interactive tools. This will 334 | help keep your audience engaged and allow them to contribute to the 335 | discussion. Be prepared to answer questions and address any concerns 336 | or feedback that may arise. 337 |

338 | 339 |

Conclusion

340 |

341 | Speaking at a Python conference can be a great way to share your 342 | knowledge and make a valuable contribution to the community. Following 343 | these tips, you can prepare a compelling presentation that engages and 344 | resonates with your audience. Remember to choose a topic you are 345 | passionate about, understand your audience, create a compelling 346 | narrative, practice your delivery, use visuals to support your 347 | message, and engage with your audience. Good luck, and happy 348 | presenting! 349 |

350 |
351 | 385 |

386 |
387 | 388 | 389 | -------------------------------------------------------------------------------- /resources/common-pitfalls/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 Common Pitfalls that get your Python Conference Talk Proposal rejected 9 | 10 | 11 | 12 | 9 Common Pitfalls that get your Python Conference Talk Proposal rejected | 13 | Python Conference Deadlines 14 | 15 | 16 | 20 | 21 | 22 | 26 | 30 | 34 | 38 | 39 | 40 | 44 | 45 | 49 | 50 | 51 | 67 | 68 | 69 | 75 | 76 | 82 | 83 | 88 | 94 | 100 | 101 | 102 | 103 | 152 | 153 | 158 | 162 | 163 | 164 | 165 | 169 | 170 | 171 | 172 | 176 | 177 | 178 | 243 |
244 | 260 |
261 |

262 | Suppose you’re looking to submit a proposal for a conference talk. In 263 | that case, knowing what to avoid is essential to increase your chances 264 | of acceptance. Here are nine common pitfalls to watch out for: 265 |

266 | 267 |

Sales pitches

268 |

269 | Remember that the conference is a community of creators and users of 270 | open-source scientific computing tools. While you can reference your 271 | closed-source product or platform, the audience will find the talk 272 | more interesting if they can try your techniques with the open-source 273 | PyData stack. Avoid making a hard sell, and focus on problem 274 | definition, proposed strategies, and business domain instead. 275 |

276 | 277 |

Repeated talks

278 |

279 | Conferences prefer new talks and new speakers. If your talk is already 280 | available online, it will unlikely be accepted for the conference. Try 281 | to bring new insights, techniques, or perspectives on a topic that 282 | hasn’t been covered before. 283 |

284 | 285 |

Lack of clarity

286 |

287 | Your proposal should clearly communicate what your talk is about and 288 | what attendees can expect to learn. Suppose your proposal is unclear, 289 | rambling, or difficult to follow. In that case, reviewers may be 290 | unable to determine if your talk aligns with the conference’s goals or 291 | is suitable for the intended audience. 292 |

293 | 294 |

Lack of originality

295 |

296 | Reviewers seek unique, insightful, and innovative talks that offer 297 | fresh perspectives or new solutions to common problems. If your 298 | proposal covers a topic that has already been covered multiple times 299 | or doesn’t provide any new insights or techniques, reviewers may pass 300 | on it. That doesn’t mean a case study or new spin on an issue won’t be 301 | accepted, but it’s worth considering that added perspective. 302 |

303 | 304 |

Overly long proposals

305 |

306 | Keep your proposal simple and clear. Good proposals typically provide 307 | all the vital information within 250 words. This is not a strict limit 308 | and varies per conference. This is a suggestion to help you stay 309 | focused and avoid losing the attention of the reviewers. 310 |

311 | 312 |

Lack of relevance

313 |

314 | Make sure your talk aligns with the conference’s theme or focus. 315 | Suppose your proposal is only tangentially related to the conference’s 316 | goals. In that case, reviewers may not see how it fits into the larger 317 | picture or how it would benefit attendees. 318 |

319 | 320 |

Future work

321 |

322 | While discussing future work is exciting and could be mentioned in 323 | your talk, the core content of the talk should already be shaped, and 324 | you should be able to describe it in your proposal. Don’t rely too 325 | heavily on future data collection or future prototyping because things 326 | often don’t go as expected. Be sure to provide concrete examples and 327 | use cases. 328 |

329 | 330 |

331 | Inappropriate or offensive content 332 |

333 |

334 | Keep your language and tone professional and respectful, and avoid 335 | controversial or sensitive topics that could offend or alienate 336 | attendees. Proposals containing inappropriate, offensive, or 337 | discriminatory content will likely be rejected. 338 |

339 | 340 |

341 | Poor fit with the conference format 342 |

343 |

344 | Conferences have different formats, from lightning talks to workshops 345 | to keynote speeches. Ensure your proposal aligns with the format and 346 | duration of the conference and can be delivered effectively in that 347 | format. Consider any equipment, materials, or resources required for 348 | your talk. 349 |

350 | 351 |

352 | By avoiding these common pitfalls, you can increase your chances of 353 | submitting a successful proposal for a conference talk that aligns 354 | with the conference’s goals, is relevant to attendees, and delivers 355 | fresh insights or techniques. 356 |

357 |
358 | 392 |

393 |
394 | 395 | 396 | -------------------------------------------------------------------------------- /conference/pyjamas-conf-2023/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Pyjamas Conf 8 | 9 | Pyjamas Conf | Python Conference Deadlines 10 | 11 | 12 | 13 | 14 | 18 | 22 | 26 | 30 | 31 | 32 | 36 | 37 | 38 | 39 | 40 | 60 | 61 | 62 | 68 | 69 | 75 | 76 | 81 | 87 | 93 | 94 | 95 | 96 | 145 | 146 | 151 | 155 | 156 | 157 | 158 | 162 | 163 | 164 | 165 | 169 | 170 | 171 | 172 | 237 |
238 | 273 |
274 |
275 |
TBA
276 |
277 |
278 |
279 |
280 | Calendar icon 287 | December 09 - 11, 2023 288 |
289 |
290 | Location icon 297 | Online 298 |
299 |
300 | Earth Icon 307 | https://pyjamas.live 310 |
311 | 312 |
Download Conference deadline:
313 |
314 |
315 | Deadline in timezone from conference website: 316 |
317 |
318 | 319 |
320 |
321 | Deadline in your local 322 | timezone: 323 |
324 |
325 | 326 |
327 |
328 | 329 |
330 |
331 |
332 |
333 | 367 |
368 | 449 | 450 | 451 | --------------------------------------------------------------------------------