├── Aptfile ├── blogs ├── __init__.py ├── tests │ ├── __init__.py │ └── utils.py ├── management │ ├── __init__.py │ └── commands │ │ └── __init__.py ├── migrations │ └── __init__.py ├── templatetags │ ├── __init__.py │ └── blogs.py ├── apps.py ├── urls.py ├── factories.py └── views.py ├── boxes ├── __init__.py ├── migrations │ ├── __init__.py │ └── 0002_auto_20150416_1853.py ├── apps.py ├── urls.py ├── admin.py ├── views.py └── templatetags │ └── boxes.py ├── cms ├── __init__.py ├── management │ ├── __init__.py │ └── commands │ │ └── __init__.py ├── templatetags │ ├── __init__.py │ └── cms.py ├── apps.py └── forms.py ├── events ├── __init__.py ├── tests │ └── __init__.py ├── management │ ├── __init__.py │ └── commands │ │ ├── __init__.py │ │ └── import_ics_calendars.py ├── migrations │ ├── __init__.py │ ├── 0005_auto_20170821_2000.py │ ├── 0007_auto_20180705_0352.py │ ├── 0003_auto_20150416_1853.py │ ├── 0002_auto_20150321_1247.py │ └── 0004_auto_20170814_0519.py ├── templatetags │ ├── __init__.py │ └── events.py └── apps.py ├── fastly ├── __init__.py ├── models.py └── utils.py ├── jobs ├── __init__.py ├── tests │ └── __init__.py ├── management │ ├── __init__.py │ └── commands │ │ ├── __init__.py │ │ └── expire_jobs.py ├── migrations │ ├── __init__.py │ ├── 0014_merge.py │ ├── 0013_auto_20170810_1625.py │ ├── 0013_auto_20170810_1627.py │ ├── 0015_auto_20170814_0301.py │ ├── 0006_region_nullable.py │ ├── 0020_auto_20191101_1601.py │ ├── 0005_job_other_job_type.py │ ├── 0004_auto_20150216_1544.py │ ├── 0016_auto_20170821_2000.py │ ├── 0018_auto_20180705_0352.py │ ├── 0003_auto_20150211_1738.py │ ├── 0019_job_submitted_by.py │ └── 0007_auto_20150227_2223.py ├── apps.py ├── signals.py └── feeds.py ├── pages ├── __init__.py ├── tests │ ├── __init__.py │ ├── fake_svn_content_checkout │ │ └── content.ht │ └── base.py ├── management │ ├── __init__.py │ └── commands │ │ └── __init__.py ├── migrations │ ├── __init__.py │ ├── 0002_auto_20150416_1853.py │ └── 0003_auto_20230214_2113.py ├── apps.py ├── urls.py ├── managers.py ├── serializers.py └── factories.py ├── users ├── __init__.py ├── tests │ └── __init__.py ├── migrations │ ├── __init__.py │ ├── 0005_user_public_profile.py │ ├── 0015_alter_user_first_name.py │ ├── 0009_auto_20170821_2000.py │ ├── 0006_auto_20150503_2124.py │ ├── 0002_auto_20150416_1853.py │ ├── 0007_auto_20150604_1555.py │ └── 0003_auto_20150503_2026.py ├── templatetags │ └── __init__.py ├── validators.py ├── apps.py ├── listeners.py └── managers.py ├── banners ├── __init__.py ├── migrations │ └── __init__.py ├── templatetags │ └── __init__.py ├── apps.py ├── admin.py └── models.py ├── codesamples ├── __init__.py ├── migrations │ └── __init__.py ├── apps.py ├── admin.py └── managers.py ├── community ├── __init__.py ├── tests │ ├── __init__.py │ ├── test_models.py │ └── test_views.py ├── migrations │ ├── __init__.py │ ├── 0003_auto_20170831_0358.py │ ├── 0004_auto_20170831_0541.py │ └── 0002_auto_20150416_1853.py ├── templatetags │ └── __init__.py ├── apps.py ├── urls.py ├── views.py └── managers.py ├── companies ├── __init__.py ├── migrations │ ├── __init__.py │ ├── 0003_auto_20170814_0301.py │ ├── 0005_auto_20180705_0352.py │ ├── 0004_auto_20170821_2000.py │ └── 0002_auto_20150416_1853.py ├── templatetags │ ├── __init__.py │ └── companies.py ├── apps.py ├── admin.py ├── tests.py └── factories.py ├── downloads ├── __init__.py ├── tests │ └── __init__.py ├── migrations │ ├── __init__.py │ ├── 0004_auto_20170821_2000.py │ ├── 0003_auto_20150824_1612.py │ ├── 0008_auto_20220907_2102.py │ ├── 0009_releasefile_sigstore_bundle_file.py │ ├── 0010_releasefile_sbom_spdx2_file.py │ ├── 0002_auto_20150416_1853.py │ ├── 0012_alter_release_version.py │ └── 0013_alter_release_content_markup_type.py ├── templatetags │ └── __init__.py └── apps.py ├── mailing ├── __init__.py ├── migrations │ └── __init__.py ├── tests │ ├── __init__.py │ ├── models.py │ └── forms.py ├── apps.py └── forms.py ├── membership ├── __init__.py ├── tests │ ├── __init__.py │ └── test_views.py ├── migrations │ └── __init__.py ├── apps.py ├── urls.py └── views.py ├── minutes ├── __init__.py ├── tests │ └── __init__.py ├── management │ ├── __init__.py │ └── commands │ │ └── __init__.py ├── migrations │ ├── __init__.py │ └── 0002_auto_20150416_1853.py ├── apps.py ├── managers.py ├── urls.py └── admin.py ├── nominations ├── __init__.py ├── migrations │ └── __init__.py ├── templatetags │ ├── __init__.py │ └── nominations.py └── apps.py ├── sponsors ├── __init__.py ├── tests │ └── __init__.py ├── management │ ├── __init__.py │ └── commands │ │ └── __init__.py ├── migrations │ ├── __init__.py │ ├── 0023_merge_20210406_1522.py │ ├── 0024_auto_20210414_1449.py │ ├── 0086_auto_20220809_1655.py │ ├── 0043_auto_20210827_1343.py │ ├── 0059_auto_20211029_1503.py │ ├── 0082_auto_20220729_1613.py │ ├── 0036_auto_20210826_1930.py │ ├── 0097_sponsorship_renewal.py │ ├── 0102_auto_20240509_2037.py │ ├── 0057_auto_20211026_1529.py │ ├── 0012_sponsorship_for_modified_package.py │ ├── 0017_sponsorbenefit_added_by_user.py │ ├── 0054_auto_20211026_1432.py │ ├── 0066_auto_20211223_1318.py │ ├── 0045_add_added_by_user_sponsorbenefit.py │ ├── 0064_sponsorshippackage_slug.py │ ├── 0067_sponsorbenefit_a_la_carte.py │ ├── 0101_sponsor_linked_in_page_url.py │ ├── 0032_sponsorcontact_accounting.py │ ├── 0039_auto_20210827_1248.py │ ├── 0034_contract_document_docx.py │ ├── 0048_auto_20210915_1425.py │ ├── 0037_sponsorship_package.py │ ├── 0042_auto_20210827_1318.py │ ├── 0091_sponsorshippackage_allow_a_la_carte.py │ ├── 0046_sponsorshippackage_advertise.py │ ├── 0044_auto_20210827_1344.py │ ├── 0078_init_current_year_singleton.py │ ├── 0022_sponsorcontact_administrative.py │ ├── 0075_auto_20220303_2023.py │ ├── 0098_auto_20231219_1910.py │ ├── 0068_auto_20220110_1841.py │ ├── 0092_auto_20220816_1517.py │ ├── 0019_sponsor_twitter_handle.py │ ├── 0089_auto_20220812_1312.py │ ├── 0093_auto_20230214_2113.py │ ├── 0027_sponsorbenefit_program_name.py │ ├── 0047_auto_20210908_1357.py │ ├── 0020_sponsorshipbenefit_unavailable.py │ ├── 0028_auto_20210707_1426.py │ └── 0065_auto_20211223_1309.py ├── templatetags │ └── __init__.py ├── pandoc_filters │ └── __init__.py ├── reference.docx ├── apps.py ├── urls.py ├── models │ └── enums.py ├── utils.py └── exceptions.py ├── work_groups ├── __init__.py ├── tests │ ├── __init__.py │ └── test_models.py ├── migrations │ ├── __init__.py │ ├── 0002_auto_20150604_2203.py │ ├── 0004_auto_20180705_0352.py │ └── 0003_auto_20170821_2000.py └── apps.py ├── .python-version ├── custom_storages └── __init__.py ├── pydotorg ├── tests │ ├── __init__.py │ └── test_classes.py ├── settings │ └── __init__.py ├── __init__.py ├── compilers.py └── celery.py ├── successstories ├── __init__.py ├── tests │ └── __init__.py ├── migrations │ ├── __init__.py │ ├── 0007_remove_story_weight.py │ ├── 0008_auto_20170821_2000.py │ ├── 0004_auto_20170724_0507.py │ ├── 0005_auto_20170726_0645.py │ ├── 0002_auto_20150416_1853.py │ ├── 0011_auto_20220127_1923.py │ ├── 0009_auto_20180705_0352.py │ └── 0010_story_submitted_by.py ├── templatetags │ ├── __init__.py │ └── successstories.py ├── apps.py └── urls.py ├── bin ├── pre_compile └── static ├── texlive.packages ├── templates ├── account │ ├── base.html │ └── logout.html ├── downloads │ ├── base.html │ ├── homepage-downloads-box.html │ └── download-sources-box.html ├── pages │ └── raw.html ├── jobs │ ├── email │ │ ├── job_was_approved_subject.txt │ │ ├── monthly_jobs_report_subject.txt │ │ ├── job_was_rejected_subject.txt │ │ ├── job_was_submitted_subject.txt │ │ ├── monthly_jobs_report.txt │ │ ├── comment_was_posted_admin.txt │ │ ├── comment_was_posted.txt │ │ ├── job_was_submitted.txt │ │ └── job_was_rejected.txt │ ├── job_type_list.html │ ├── job_category_list.html │ ├── job_telecommute_list.html │ ├── header_content.html │ ├── featured_companies-widget.html │ └── job_types.html ├── sponsors │ ├── email │ │ ├── psf_contract_subject.txt │ │ ├── psf_rejected_sponsorship_subject.txt │ │ ├── sponsor_contract_subject.txt │ │ ├── psf_new_application_subject.txt │ │ ├── sponsor_contract.txt │ │ ├── sponsor_rejected_sponsorship_subject.txt │ │ ├── sponsor_new_application_subject.txt │ │ ├── psf_contract.txt │ │ ├── sponsor_expiring_assets_subject.txt │ │ ├── sponsor_rejected_sponsorship.txt │ │ ├── psf_rejected_sponsorship.txt │ │ ├── psf_new_application.txt │ │ └── sponsor_expiring_assets.txt │ └── admin │ │ ├── sponsors_sponsorshipcurrentyear_changelist.html │ │ └── sponsorshipbenefit_change_form.html ├── search │ ├── indexes │ │ ├── jobs │ │ │ ├── jobtype_text.txt │ │ │ ├── jobcategory_text.txt │ │ │ └── job_text.txt │ │ ├── pages │ │ │ └── page_text.txt │ │ ├── downloads │ │ │ └── release_text.txt │ │ └── events │ │ │ ├── calendar_text.txt │ │ │ └── event_text.txt │ └── includes │ │ ├── jobs.job_category.html │ │ ├── jobs.job_type.html │ │ ├── pages.page.html │ │ ├── jobs.job.html │ │ ├── downloads.release.html │ │ └── events.calendar.html ├── community │ ├── types │ │ ├── photo.html │ │ ├── text.html │ │ ├── video.html │ │ ├── default.html │ │ └── link.html │ └── post_detail.html ├── users │ ├── membership_vote_affirm_done.html │ ├── membership_vote_affirm.html │ └── membership_thanks.html ├── sitetree │ ├── sidebar_menu_root.html │ ├── footer_children.html │ ├── submenu_children.html │ ├── footer.html │ ├── top.html │ ├── breadcrumbs.html │ └── menu.html ├── events │ ├── eventcategory_list.html │ ├── email │ │ └── new_event.txt │ └── event_form_thanks.html ├── pypl │ └── index.html ├── shop │ └── index.html ├── components │ ├── psf-widget.html │ └── navigation-widget.html ├── docs │ └── index.html ├── cms │ └── iso_time_tag.html ├── admin │ └── base_site.html ├── blogs │ └── supernav.html ├── 403.html ├── python │ └── shell.html ├── 500.html ├── mailing │ └── admin │ │ └── base_email_template_form.html ├── registration │ └── logged_out.html ├── robots.txt └── successstories │ ├── supernav.html │ └── storycategory_detail.html ├── docs-requirements.txt ├── docutils.conf ├── requirements.txt ├── static ├── community_logos │ ├── README.txt │ ├── python-logo.png │ ├── python-powered-h-50x65.png │ ├── python-powered-h-70x91.png │ ├── python-powered-w-70x28.png │ ├── python-logo-master-v3-TM.png │ ├── python-logo-master-v3-TM.psd │ ├── python-powered-h-100x130.png │ ├── python-powered-h-140x182.png │ ├── python-powered-w-100x40.png │ ├── python-powered-w-140x56.png │ ├── python-powered-w-200x80.png │ └── python-logo-master-v3-TM-flattened.png ├── favicon.ico ├── images │ ├── CCP.jpg │ ├── README.txt │ ├── blank.gif │ ├── bullet.gif │ ├── donate.png │ ├── google.gif │ ├── pynasa.jpg │ ├── pyxp.jpg │ ├── tabblo.png │ ├── trans.gif │ ├── zeuux.jpg │ ├── OSAFLogo.gif │ ├── Red_Hat.png │ ├── astilogo.gif │ ├── beslist.png │ ├── bizrate.gif │ ├── emd_logo.gif │ ├── hw128_28.gif │ ├── ironport.gif │ ├── microbit.png │ ├── psf-logo.gif │ ├── pyastra.jpg │ ├── pygoogle.jpg │ ├── sun_logo.png │ ├── winglogo.gif │ ├── worldmap.jpg │ ├── zeomega.gif │ ├── activegrid.gif │ ├── arraylogo.jpg │ ├── enthought.jpg │ ├── enthought.png │ ├── freewear-1.png │ ├── globo_logo.gif │ ├── header-bg.png │ ├── header-bg2.png │ ├── hood_logo.gif │ ├── knmp-logo.png │ ├── nav-off-bg.png │ ├── nav-on-bg.png │ ├── pep-0001-1.png │ ├── python-logo.gif │ ├── pythonlogo.pdf │ ├── pythonlogo.png │ ├── pythonlogo.tiff │ ├── seo_moves.jpg │ ├── strakt_logo.gif │ ├── wargaming.png │ ├── zope_logo.gif │ ├── PythonPowered.gif │ ├── button-on-bg.png │ ├── cpacket_logo.jpg │ ├── favicon16x16.ico │ ├── finding-idle.png │ ├── freewear-logo.png │ ├── hitflip_logo.jpg │ ├── openeye-logo.gif │ ├── oreilly_logo.gif │ ├── py_mac-sq-64.png │ ├── success │ │ ├── mmtk.jpg │ │ ├── nasa.jpg │ │ ├── Carmanah.png │ │ ├── afnic.fr.png │ │ ├── journyx.png │ │ ├── mayavi.jpg │ │ ├── tribon.jpg │ │ ├── Honeywell.png │ │ ├── StAndrews.png │ │ ├── frequentis.png │ │ ├── natsworld.png │ │ ├── standrews.jpg │ │ ├── forecastwatch.png │ │ └── superleague.png │ ├── uniblue-logo.jpg │ ├── ExowebGlossyLogo.png │ ├── Lucasfilm_logo.png │ ├── activestate_logo.gif │ ├── canonical-logo.png │ ├── open_end_ab_logo.png │ ├── pattern_banner.gif │ ├── pythongear-logo.png │ ├── zimbio_corp_logo.gif │ ├── Google_Logo_25wht.gif │ ├── PythonPoweredAnim.gif │ ├── PythonPoweredSmall.gif │ ├── batteries-included.jpg │ ├── infrastructure │ │ ├── dyn.png │ │ ├── osl.png │ │ ├── gandi.png │ │ ├── xs4all.png │ │ ├── pingdom.png │ │ ├── upfront.png │ │ └── pagerduty.png │ ├── logo_lincoln_loop.png │ ├── opensource-110x95.png │ ├── pycon-2010-banner.png │ ├── python-data-100x40.png │ ├── python-video-icon.png │ ├── terminal-in-finder.png │ ├── osi-certified-120x100.gif │ ├── python-audio-100x40.png │ ├── PythonPoweredAnimSmall.gif │ └── OnlineDegreeReviews-Logo.png ├── img │ ├── psf-logo.png │ ├── python-logo.png │ ├── sample-gmap.png │ ├── landing-about.png │ ├── landing-docs.png │ ├── psf-logo_print.png │ ├── success-glow2.png │ ├── bg_direction_nav.png │ ├── landing-community.png │ ├── landing-downloads.png │ ├── python-logo-large.png │ ├── python-logo_print.png │ └── sponsors │ │ ├── tick-placeholder.png │ │ ├── title-1.svg │ │ ├── title-4.svg │ │ ├── title-2.svg │ │ ├── title-5.svg │ │ ├── title-6.svg │ │ ├── title-3.svg │ │ └── tick.svg ├── fonts │ ├── FluxBold.eot │ ├── FluxBold.ttf │ ├── FluxBold.woff │ ├── FluxItalic.eot │ ├── FluxItalic.ttf │ ├── FluxItalic.woff │ ├── FluxRegular.eot │ ├── FluxRegular.ttf │ ├── FluxRegular.woff │ ├── FontAwesome.otf │ ├── Pythonicon.eot │ ├── Pythonicon.ttf │ ├── Pythonicon.woff │ ├── FluxBoldItalic.eot │ ├── FluxBoldItalic.ttf │ ├── FluxBoldItalic.woff │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.ttf │ ├── fontawesome-webfont.woff │ ├── fontawesome-webfont.woff2 │ ├── SourceSansPro-It-webfont.eot │ ├── SourceSansPro-It-webfont.ttf │ ├── SourceSansPro-Bold-webfont.eot │ ├── SourceSansPro-Bold-webfont.ttf │ ├── SourceSansPro-Bold-webfont.woff │ ├── SourceSansPro-It-webfont.woff │ ├── SourceSansPro-Regular-webfont.eot │ ├── SourceSansPro-Regular-webfont.ttf │ └── SourceSansPro-Regular-webfont.woff ├── metro-icon-144x144.png ├── source_files │ ├── glow.psd │ ├── artboard.psd │ ├── python-logo-mods.ai │ ├── python-top-logo.psd │ ├── psf-top-logo-beta.psd │ ├── python-logo-mods-v2.ai │ └── python-top-logo-beta.psd ├── opengraph-icon-200x200.png ├── apple-touch-icon-precomposed.png ├── apple-touch-icon-72x72-precomposed.png ├── apple-touch-icon-114x114-precomposed.png ├── apple-touch-icon-144x144-precomposed.png └── js │ └── libs │ └── html-includes.js ├── package.json ├── .github ├── CODEOWNERS ├── PULL_REQUEST_TEMPLATE.md └── ISSUE_TEMPLATE │ └── config.yml ├── infra ├── Makefile ├── config.tf ├── .gitignore ├── cdn │ ├── versions.tf │ └── providers.tf └── variables.tf ├── docs └── source │ └── _images │ └── supernav-example.png ├── .gitattributes ├── Dockerfile.static ├── Gemfile ├── prod-requirements.txt ├── Procfile ├── fixtures └── README.md ├── dev-requirements.txt ├── gunicorn.conf ├── .readthedocs.yaml ├── .coveragerc ├── Gemfile.lock └── env_sample /Aptfile: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /blogs/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /boxes/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /cms/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /events/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fastly/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jobs/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pages/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /users/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /banners/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /blogs/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /codesamples/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /community/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /companies/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /downloads/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jobs/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /mailing/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /membership/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /minutes/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nominations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pages/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sponsors/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /users/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /work_groups/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.python-version: -------------------------------------------------------------------------------- 1 | 3.12.6 2 | -------------------------------------------------------------------------------- /blogs/management/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /blogs/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /boxes/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /cms/management/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /cms/templatetags/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /community/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /custom_storages/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /downloads/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /events/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jobs/management/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jobs/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /membership/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /minutes/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pages/management/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pages/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pydotorg/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sponsors/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /successstories/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /users/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /banners/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /banners/templatetags/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /blogs/templatetags/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /community/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /companies/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /downloads/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /events/management/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /events/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /events/templatetags/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /mailing/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /membership/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /minutes/management/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /minutes/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pydotorg/settings/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sponsors/management/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sponsors/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sponsors/templatetags/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /successstories/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /users/templatetags/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /work_groups/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /work_groups/tests/test_models.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /blogs/management/commands/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /cms/management/commands/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /codesamples/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /community/templatetags/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /companies/templatetags/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /downloads/templatetags/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /events/management/commands/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /jobs/management/commands/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nominations/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /nominations/templatetags/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pages/management/commands/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sponsors/pandoc_filters/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /successstories/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /work_groups/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /bin/pre_compile: -------------------------------------------------------------------------------- 1 | npm -g install yuglify 2 | -------------------------------------------------------------------------------- /minutes/management/commands/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sponsors/management/commands/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /successstories/templatetags/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /texlive.packages: -------------------------------------------------------------------------------- 1 | xcolor 2 | etoolbox 3 | -------------------------------------------------------------------------------- /fastly/models.py: -------------------------------------------------------------------------------- 1 | # Intentionally left blank 2 | -------------------------------------------------------------------------------- /templates/account/base.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} -------------------------------------------------------------------------------- /docs-requirements.txt: -------------------------------------------------------------------------------- 1 | sphinx 2 | myst-parser 3 | furo 4 | -------------------------------------------------------------------------------- /templates/downloads/base.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} -------------------------------------------------------------------------------- /templates/pages/raw.html: -------------------------------------------------------------------------------- 1 | {{ page.content.raw|safe }} 2 | -------------------------------------------------------------------------------- /docutils.conf: -------------------------------------------------------------------------------- 1 | [general] 2 | halt_level=5 3 | report_level=5 4 | -------------------------------------------------------------------------------- /mailing/tests/__init__.py: -------------------------------------------------------------------------------- 1 | """Tests for the mailing app.""" 2 | -------------------------------------------------------------------------------- /pages/tests/fake_svn_content_checkout/content.ht: -------------------------------------------------------------------------------- 1 | third line 2 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | -r base-requirements.txt 2 | -r prod-requirements.txt 3 | -------------------------------------------------------------------------------- /static/community_logos/README.txt: -------------------------------------------------------------------------------- 1 | These images are linked from /community/logos/. 2 | -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/favicon.ico -------------------------------------------------------------------------------- /templates/jobs/email/job_was_approved_subject.txt: -------------------------------------------------------------------------------- 1 | Python Job Board: Job entry approved 2 | -------------------------------------------------------------------------------- /static/images/CCP.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/CCP.jpg -------------------------------------------------------------------------------- /static/images/README.txt: -------------------------------------------------------------------------------- 1 | These images are from the initial Python.org content import from SVN 2 | -------------------------------------------------------------------------------- /templates/jobs/email/monthly_jobs_report_subject.txt: -------------------------------------------------------------------------------- 1 | Monthly Jobs Report for {% now "F Y" %} 2 | -------------------------------------------------------------------------------- /templates/sponsors/email/psf_contract_subject.txt: -------------------------------------------------------------------------------- 1 | STATEMENT OF WORK to psf-sponsors@python.org 2 | -------------------------------------------------------------------------------- /sponsors/reference.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/sponsors/reference.docx -------------------------------------------------------------------------------- /static/images/blank.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/blank.gif -------------------------------------------------------------------------------- /static/images/bullet.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/bullet.gif -------------------------------------------------------------------------------- /static/images/donate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/donate.png -------------------------------------------------------------------------------- /static/images/google.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/google.gif -------------------------------------------------------------------------------- /static/images/pynasa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/pynasa.jpg -------------------------------------------------------------------------------- /static/images/pyxp.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/pyxp.jpg -------------------------------------------------------------------------------- /static/images/tabblo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/tabblo.png -------------------------------------------------------------------------------- /static/images/trans.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/trans.gif -------------------------------------------------------------------------------- /static/images/zeuux.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/zeuux.jpg -------------------------------------------------------------------------------- /static/img/psf-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/img/psf-logo.png -------------------------------------------------------------------------------- /templates/jobs/email/job_was_rejected_subject.txt: -------------------------------------------------------------------------------- 1 | Python Job Board: Job entry could not be accepted 2 | -------------------------------------------------------------------------------- /templates/search/indexes/jobs/jobtype_text.txt: -------------------------------------------------------------------------------- 1 | job type 2 | {{ object.name }} 3 | {{ object.name }} type -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pythondotorg", 3 | "description": "Django App behind python.org" 4 | } 5 | -------------------------------------------------------------------------------- /pydotorg/__init__.py: -------------------------------------------------------------------------------- 1 | from pydotorg.celery import app as celery_app 2 | 3 | __all__ = ("celery_app",) 4 | -------------------------------------------------------------------------------- /static/fonts/FluxBold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/FluxBold.eot -------------------------------------------------------------------------------- /static/fonts/FluxBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/FluxBold.ttf -------------------------------------------------------------------------------- /static/fonts/FluxBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/FluxBold.woff -------------------------------------------------------------------------------- /static/images/OSAFLogo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/OSAFLogo.gif -------------------------------------------------------------------------------- /static/images/Red_Hat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/Red_Hat.png -------------------------------------------------------------------------------- /static/images/astilogo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/astilogo.gif -------------------------------------------------------------------------------- /static/images/beslist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/beslist.png -------------------------------------------------------------------------------- /static/images/bizrate.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/bizrate.gif -------------------------------------------------------------------------------- /static/images/emd_logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/emd_logo.gif -------------------------------------------------------------------------------- /static/images/hw128_28.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/hw128_28.gif -------------------------------------------------------------------------------- /static/images/ironport.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/ironport.gif -------------------------------------------------------------------------------- /static/images/microbit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/microbit.png -------------------------------------------------------------------------------- /static/images/psf-logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/psf-logo.gif -------------------------------------------------------------------------------- /static/images/pyastra.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/pyastra.jpg -------------------------------------------------------------------------------- /static/images/pygoogle.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/pygoogle.jpg -------------------------------------------------------------------------------- /static/images/sun_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/sun_logo.png -------------------------------------------------------------------------------- /static/images/winglogo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/winglogo.gif -------------------------------------------------------------------------------- /static/images/worldmap.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/worldmap.jpg -------------------------------------------------------------------------------- /static/images/zeomega.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/zeomega.gif -------------------------------------------------------------------------------- /static/img/python-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/img/python-logo.png -------------------------------------------------------------------------------- /static/img/sample-gmap.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/img/sample-gmap.png -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # Notify @EWDurbin for all opened Issues and Pull Requests 2 | * @EWDurbin @JacobCoffee 3 | -------------------------------------------------------------------------------- /static/fonts/FluxItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/FluxItalic.eot -------------------------------------------------------------------------------- /static/fonts/FluxItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/FluxItalic.ttf -------------------------------------------------------------------------------- /static/fonts/FluxItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/FluxItalic.woff -------------------------------------------------------------------------------- /static/fonts/FluxRegular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/FluxRegular.eot -------------------------------------------------------------------------------- /static/fonts/FluxRegular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/FluxRegular.ttf -------------------------------------------------------------------------------- /static/fonts/FluxRegular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/FluxRegular.woff -------------------------------------------------------------------------------- /static/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /static/fonts/Pythonicon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/Pythonicon.eot -------------------------------------------------------------------------------- /static/fonts/Pythonicon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/Pythonicon.ttf -------------------------------------------------------------------------------- /static/fonts/Pythonicon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/Pythonicon.woff -------------------------------------------------------------------------------- /static/images/activegrid.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/activegrid.gif -------------------------------------------------------------------------------- /static/images/arraylogo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/arraylogo.jpg -------------------------------------------------------------------------------- /static/images/enthought.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/enthought.jpg -------------------------------------------------------------------------------- /static/images/enthought.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/enthought.png -------------------------------------------------------------------------------- /static/images/freewear-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/freewear-1.png -------------------------------------------------------------------------------- /static/images/globo_logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/globo_logo.gif -------------------------------------------------------------------------------- /static/images/header-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/header-bg.png -------------------------------------------------------------------------------- /static/images/header-bg2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/header-bg2.png -------------------------------------------------------------------------------- /static/images/hood_logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/hood_logo.gif -------------------------------------------------------------------------------- /static/images/knmp-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/knmp-logo.png -------------------------------------------------------------------------------- /static/images/nav-off-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/nav-off-bg.png -------------------------------------------------------------------------------- /static/images/nav-on-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/nav-on-bg.png -------------------------------------------------------------------------------- /static/images/pep-0001-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/pep-0001-1.png -------------------------------------------------------------------------------- /static/images/python-logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/python-logo.gif -------------------------------------------------------------------------------- /static/images/pythonlogo.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/pythonlogo.pdf -------------------------------------------------------------------------------- /static/images/pythonlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/pythonlogo.png -------------------------------------------------------------------------------- /static/images/pythonlogo.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/pythonlogo.tiff -------------------------------------------------------------------------------- /static/images/seo_moves.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/seo_moves.jpg -------------------------------------------------------------------------------- /static/images/strakt_logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/strakt_logo.gif -------------------------------------------------------------------------------- /static/images/wargaming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/wargaming.png -------------------------------------------------------------------------------- /static/images/zope_logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/zope_logo.gif -------------------------------------------------------------------------------- /static/img/landing-about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/img/landing-about.png -------------------------------------------------------------------------------- /static/img/landing-docs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/img/landing-docs.png -------------------------------------------------------------------------------- /static/img/psf-logo_print.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/img/psf-logo_print.png -------------------------------------------------------------------------------- /static/img/success-glow2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/img/success-glow2.png -------------------------------------------------------------------------------- /static/metro-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/metro-icon-144x144.png -------------------------------------------------------------------------------- /static/source_files/glow.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/source_files/glow.psd -------------------------------------------------------------------------------- /templates/jobs/email/job_was_submitted_subject.txt: -------------------------------------------------------------------------------- 1 | Job Submitted for Approval: {{ content_object.display_name }} -------------------------------------------------------------------------------- /templates/sponsors/email/psf_rejected_sponsorship_subject.txt: -------------------------------------------------------------------------------- 1 | REJECTED SPONSORSHIP to psf-sponsors@python.org 2 | -------------------------------------------------------------------------------- /templates/sponsors/email/sponsor_contract_subject.txt: -------------------------------------------------------------------------------- 1 | STATEMENT OF WORK subject email user + verified emails 2 | -------------------------------------------------------------------------------- /static/fonts/FluxBoldItalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/FluxBoldItalic.eot -------------------------------------------------------------------------------- /static/fonts/FluxBoldItalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/FluxBoldItalic.ttf -------------------------------------------------------------------------------- /static/images/PythonPowered.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/PythonPowered.gif -------------------------------------------------------------------------------- /static/images/button-on-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/button-on-bg.png -------------------------------------------------------------------------------- /static/images/cpacket_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/cpacket_logo.jpg -------------------------------------------------------------------------------- /static/images/favicon16x16.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/favicon16x16.ico -------------------------------------------------------------------------------- /static/images/finding-idle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/finding-idle.png -------------------------------------------------------------------------------- /static/images/freewear-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/freewear-logo.png -------------------------------------------------------------------------------- /static/images/hitflip_logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/hitflip_logo.jpg -------------------------------------------------------------------------------- /static/images/openeye-logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/openeye-logo.gif -------------------------------------------------------------------------------- /static/images/oreilly_logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/oreilly_logo.gif -------------------------------------------------------------------------------- /static/images/py_mac-sq-64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/py_mac-sq-64.png -------------------------------------------------------------------------------- /static/images/success/mmtk.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/success/mmtk.jpg -------------------------------------------------------------------------------- /static/images/success/nasa.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/success/nasa.jpg -------------------------------------------------------------------------------- /static/images/uniblue-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/uniblue-logo.jpg -------------------------------------------------------------------------------- /static/img/bg_direction_nav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/img/bg_direction_nav.png -------------------------------------------------------------------------------- /templates/search/includes/jobs.job_category.html: -------------------------------------------------------------------------------- 1 |

Python {{ result.name }} Jobs

-------------------------------------------------------------------------------- /templates/search/includes/jobs.job_type.html: -------------------------------------------------------------------------------- 1 |

Python {{ result.name }} Jobs

-------------------------------------------------------------------------------- /templates/search/indexes/jobs/jobcategory_text.txt: -------------------------------------------------------------------------------- 1 | job category 2 | {{ object.name }} 3 | {{ object.name }} category -------------------------------------------------------------------------------- /cms/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CmsAppConfig(AppConfig): 5 | 6 | name = 'cms' 7 | -------------------------------------------------------------------------------- /static/fonts/FluxBoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/FluxBoldItalic.woff -------------------------------------------------------------------------------- /static/images/ExowebGlossyLogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/ExowebGlossyLogo.png -------------------------------------------------------------------------------- /static/images/Lucasfilm_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/Lucasfilm_logo.png -------------------------------------------------------------------------------- /static/images/activestate_logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/activestate_logo.gif -------------------------------------------------------------------------------- /static/images/canonical-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/canonical-logo.png -------------------------------------------------------------------------------- /static/images/open_end_ab_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/open_end_ab_logo.png -------------------------------------------------------------------------------- /static/images/pattern_banner.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/pattern_banner.gif -------------------------------------------------------------------------------- /static/images/pythongear-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/pythongear-logo.png -------------------------------------------------------------------------------- /static/images/success/Carmanah.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/success/Carmanah.png -------------------------------------------------------------------------------- /static/images/success/afnic.fr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/success/afnic.fr.png -------------------------------------------------------------------------------- /static/images/success/journyx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/success/journyx.png -------------------------------------------------------------------------------- /static/images/success/mayavi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/success/mayavi.jpg -------------------------------------------------------------------------------- /static/images/success/tribon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/success/tribon.jpg -------------------------------------------------------------------------------- /static/images/zimbio_corp_logo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/zimbio_corp_logo.gif -------------------------------------------------------------------------------- /static/img/landing-community.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/img/landing-community.png -------------------------------------------------------------------------------- /static/img/landing-downloads.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/img/landing-downloads.png -------------------------------------------------------------------------------- /static/img/python-logo-large.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/img/python-logo-large.png -------------------------------------------------------------------------------- /static/img/python-logo_print.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/img/python-logo_print.png -------------------------------------------------------------------------------- /static/opengraph-icon-200x200.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/opengraph-icon-200x200.png -------------------------------------------------------------------------------- /static/source_files/artboard.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/source_files/artboard.psd -------------------------------------------------------------------------------- /blogs/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class BlogsAppConfig(AppConfig): 5 | 6 | name = 'blogs' 7 | -------------------------------------------------------------------------------- /boxes/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class BoxesAppConfig(AppConfig): 5 | 6 | name = 'boxes' 7 | -------------------------------------------------------------------------------- /infra/Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: fmt 2 | fmt: 3 | @terraform fmt ./**/*.tf 4 | 5 | .PHONY: check 6 | check: 7 | @terraform validate 8 | -------------------------------------------------------------------------------- /mailing/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class MailingConfig(AppConfig): 5 | name = 'mailing' 6 | -------------------------------------------------------------------------------- /pages/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PagesAppConfig(AppConfig): 5 | 6 | name = 'pages' 7 | -------------------------------------------------------------------------------- /static/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /static/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /static/images/Google_Logo_25wht.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/Google_Logo_25wht.gif -------------------------------------------------------------------------------- /static/images/PythonPoweredAnim.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/PythonPoweredAnim.gif -------------------------------------------------------------------------------- /static/images/PythonPoweredSmall.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/PythonPoweredSmall.gif -------------------------------------------------------------------------------- /static/images/batteries-included.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/batteries-included.jpg -------------------------------------------------------------------------------- /static/images/infrastructure/dyn.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/infrastructure/dyn.png -------------------------------------------------------------------------------- /static/images/infrastructure/osl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/infrastructure/osl.png -------------------------------------------------------------------------------- /static/images/logo_lincoln_loop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/logo_lincoln_loop.png -------------------------------------------------------------------------------- /static/images/opensource-110x95.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/opensource-110x95.png -------------------------------------------------------------------------------- /static/images/pycon-2010-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/pycon-2010-banner.png -------------------------------------------------------------------------------- /static/images/python-data-100x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/python-data-100x40.png -------------------------------------------------------------------------------- /static/images/python-video-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/python-video-icon.png -------------------------------------------------------------------------------- /static/images/success/Honeywell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/success/Honeywell.png -------------------------------------------------------------------------------- /static/images/success/StAndrews.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/success/StAndrews.png -------------------------------------------------------------------------------- /static/images/success/frequentis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/success/frequentis.png -------------------------------------------------------------------------------- /static/images/success/natsworld.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/success/natsworld.png -------------------------------------------------------------------------------- /static/images/success/standrews.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/success/standrews.jpg -------------------------------------------------------------------------------- /static/images/terminal-in-finder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/terminal-in-finder.png -------------------------------------------------------------------------------- /templates/sponsors/email/psf_new_application_subject.txt: -------------------------------------------------------------------------------- 1 | New sponsorship application from {{ sponsorship.sponsor.name }} 2 | -------------------------------------------------------------------------------- /templates/sponsors/email/sponsor_contract.txt: -------------------------------------------------------------------------------- 1 | content email sponsors 2 | 3 | STATEMENT OF WORK 4 | 5 | {{ sponsorship }} 6 | -------------------------------------------------------------------------------- /templates/sponsors/email/sponsor_rejected_sponsorship_subject.txt: -------------------------------------------------------------------------------- 1 | REJECTED SPONSORSHIP subject email user + verified emails 2 | -------------------------------------------------------------------------------- /banners/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class BannersAppConfig(AppConfig): 5 | 6 | name = 'banners' 7 | -------------------------------------------------------------------------------- /events/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class EventsAppConfig(AppConfig): 5 | 6 | name = 'events' 7 | -------------------------------------------------------------------------------- /minutes/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class MinutesAppConfig(AppConfig): 5 | 6 | name = 'minutes' 7 | -------------------------------------------------------------------------------- /static/apple-touch-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/apple-touch-icon-precomposed.png -------------------------------------------------------------------------------- /static/community_logos/python-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/community_logos/python-logo.png -------------------------------------------------------------------------------- /static/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /static/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /static/images/infrastructure/gandi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/infrastructure/gandi.png -------------------------------------------------------------------------------- /static/images/infrastructure/xs4all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/infrastructure/xs4all.png -------------------------------------------------------------------------------- /static/images/osi-certified-120x100.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/osi-certified-120x100.gif -------------------------------------------------------------------------------- /static/images/python-audio-100x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/python-audio-100x40.png -------------------------------------------------------------------------------- /static/images/success/forecastwatch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/success/forecastwatch.png -------------------------------------------------------------------------------- /static/images/success/superleague.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/success/superleague.png -------------------------------------------------------------------------------- /static/source_files/python-logo-mods.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/source_files/python-logo-mods.ai -------------------------------------------------------------------------------- /static/source_files/python-top-logo.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/source_files/python-top-logo.psd -------------------------------------------------------------------------------- /templates/community/types/photo.html: -------------------------------------------------------------------------------- 1 |

todo: types/photo.html - {{ object }}

2 | -------------------------------------------------------------------------------- /templates/community/types/text.html: -------------------------------------------------------------------------------- 1 |

todo: types/text.html - {{ object }}

2 | -------------------------------------------------------------------------------- /templates/community/types/video.html: -------------------------------------------------------------------------------- 1 |

todo: types/video.html - {{ object }}

2 | -------------------------------------------------------------------------------- /templates/sponsors/email/sponsor_new_application_subject.txt: -------------------------------------------------------------------------------- 1 | Thank you for applying to sponsor the Python Software Foundation 2 | -------------------------------------------------------------------------------- /community/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CommunityAppConfig(AppConfig): 5 | 6 | name = 'community' 7 | -------------------------------------------------------------------------------- /companies/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CompaniesAppConfig(AppConfig): 5 | 6 | name = 'companies' 7 | -------------------------------------------------------------------------------- /docs/source/_images/supernav-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/docs/source/_images/supernav-example.png -------------------------------------------------------------------------------- /downloads/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class DownloadsAppConfig(AppConfig): 5 | 6 | name = 'downloads' 7 | -------------------------------------------------------------------------------- /sponsors/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class SponsorsAppConfig(AppConfig): 5 | 6 | name = 'sponsors' 7 | -------------------------------------------------------------------------------- /static/fonts/SourceSansPro-It-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/SourceSansPro-It-webfont.eot -------------------------------------------------------------------------------- /static/fonts/SourceSansPro-It-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/SourceSansPro-It-webfont.ttf -------------------------------------------------------------------------------- /static/images/PythonPoweredAnimSmall.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/PythonPoweredAnimSmall.gif -------------------------------------------------------------------------------- /static/images/infrastructure/pingdom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/infrastructure/pingdom.png -------------------------------------------------------------------------------- /static/images/infrastructure/upfront.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/infrastructure/upfront.png -------------------------------------------------------------------------------- /static/img/sponsors/tick-placeholder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/img/sponsors/tick-placeholder.png -------------------------------------------------------------------------------- /static/source_files/psf-top-logo-beta.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/source_files/psf-top-logo-beta.psd -------------------------------------------------------------------------------- /templates/community/types/default.html: -------------------------------------------------------------------------------- 1 |

todo: types/default.html - {{ object }}

2 | -------------------------------------------------------------------------------- /templates/sponsors/email/psf_contract.txt: -------------------------------------------------------------------------------- 1 | content email psf-sponsors@python.org 2 | 3 | STATEMENT OF WORK 4 | 5 | {{ sponsorship }} 6 | -------------------------------------------------------------------------------- /templates/sponsors/email/sponsor_expiring_assets_subject.txt: -------------------------------------------------------------------------------- 1 | [Action Required] PSF Sponsor deadline approaching in {{ days }} days 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | static/sass/*.css linguist-vendored 2 | static/js/libs/*.js linguist-vendored 3 | static/js/plugins/*.js linguist-vendored 4 | -------------------------------------------------------------------------------- /membership/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class MembershipAppConfig(AppConfig): 5 | 6 | name = 'membership' 7 | -------------------------------------------------------------------------------- /static/fonts/SourceSansPro-Bold-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/SourceSansPro-Bold-webfont.eot -------------------------------------------------------------------------------- /static/fonts/SourceSansPro-Bold-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/SourceSansPro-Bold-webfont.ttf -------------------------------------------------------------------------------- /static/fonts/SourceSansPro-Bold-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/SourceSansPro-Bold-webfont.woff -------------------------------------------------------------------------------- /static/fonts/SourceSansPro-It-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/SourceSansPro-It-webfont.woff -------------------------------------------------------------------------------- /static/images/OnlineDegreeReviews-Logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/OnlineDegreeReviews-Logo.png -------------------------------------------------------------------------------- /static/images/infrastructure/pagerduty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/images/infrastructure/pagerduty.png -------------------------------------------------------------------------------- /static/source_files/python-logo-mods-v2.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/source_files/python-logo-mods-v2.ai -------------------------------------------------------------------------------- /static/source_files/python-top-logo-beta.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/source_files/python-top-logo-beta.psd -------------------------------------------------------------------------------- /templates/search/indexes/pages/page_text.txt: -------------------------------------------------------------------------------- 1 | {{ object.title }} 2 | {{ object.keywords }} 3 | {{ object.description }} 4 | {{ object.content }} -------------------------------------------------------------------------------- /templates/sponsors/email/sponsor_rejected_sponsorship.txt: -------------------------------------------------------------------------------- 1 | content email sponsors 2 | 3 | REJECTED SPONSORSHIP 4 | 5 | {{ sponsorship }} 6 | -------------------------------------------------------------------------------- /work_groups/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class WorkGroupsAppConfig(AppConfig): 5 | 6 | name = 'work_groups' 7 | -------------------------------------------------------------------------------- /bin/static: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cd static 3 | bundle exec sass --compass --scss -I $(dirname $(dirname $(gem which susy))) --trace --watch sass:sass 4 | -------------------------------------------------------------------------------- /codesamples/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CodesamplesAppConfig(AppConfig): 5 | 6 | name = 'codesamples' 7 | -------------------------------------------------------------------------------- /nominations/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class NominationsAppConfig(AppConfig): 5 | 6 | name = 'nominations' 7 | -------------------------------------------------------------------------------- /static/apple-touch-icon-72x72-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/apple-touch-icon-72x72-precomposed.png -------------------------------------------------------------------------------- /static/fonts/SourceSansPro-Regular-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/SourceSansPro-Regular-webfont.eot -------------------------------------------------------------------------------- /static/fonts/SourceSansPro-Regular-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/SourceSansPro-Regular-webfont.ttf -------------------------------------------------------------------------------- /templates/search/indexes/downloads/release_text.txt: -------------------------------------------------------------------------------- 1 | {{ object.name }} 2 | {{ object.version }} 3 | {{ object.path }} 4 | {{ object.content }} 5 | -------------------------------------------------------------------------------- /users/validators.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.validators import ASCIIUsernameValidator 2 | 3 | username_validators = [ASCIIUsernameValidator()] 4 | -------------------------------------------------------------------------------- /blogs/tests/utils.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | 4 | def get_test_rss_path(): 5 | return os.path.join(os.path.dirname(__file__), 'psf_feed_example.xml') 6 | -------------------------------------------------------------------------------- /boxes/urls.py: -------------------------------------------------------------------------------- 1 | from .views import box 2 | from django.urls import path 3 | 4 | urlpatterns = [ 5 | path('/', box, name='box'), 6 | ] 7 | -------------------------------------------------------------------------------- /static/apple-touch-icon-114x114-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/apple-touch-icon-114x114-precomposed.png -------------------------------------------------------------------------------- /static/apple-touch-icon-144x144-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/apple-touch-icon-144x144-precomposed.png -------------------------------------------------------------------------------- /static/community_logos/python-powered-h-50x65.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/community_logos/python-powered-h-50x65.png -------------------------------------------------------------------------------- /static/community_logos/python-powered-h-70x91.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/community_logos/python-powered-h-70x91.png -------------------------------------------------------------------------------- /static/community_logos/python-powered-w-70x28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/community_logos/python-powered-w-70x28.png -------------------------------------------------------------------------------- /static/fonts/SourceSansPro-Regular-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/fonts/SourceSansPro-Regular-webfont.woff -------------------------------------------------------------------------------- /successstories/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class SuccessstoriesAppConfig(AppConfig): 5 | 6 | name = 'successstories' 7 | -------------------------------------------------------------------------------- /templates/sponsors/email/psf_rejected_sponsorship.txt: -------------------------------------------------------------------------------- 1 | content email psf-sponsors@python.org 2 | 3 | REJECTED SPONSORSHIP 4 | 5 | {{ sponsorship }} 6 | -------------------------------------------------------------------------------- /blogs/urls.py: -------------------------------------------------------------------------------- 1 | from . import views 2 | from django.urls import path 3 | 4 | urlpatterns = [ 5 | path('', views.BlogHome.as_view(), name='blog'), 6 | ] 7 | -------------------------------------------------------------------------------- /static/community_logos/python-logo-master-v3-TM.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/community_logos/python-logo-master-v3-TM.png -------------------------------------------------------------------------------- /static/community_logos/python-logo-master-v3-TM.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/community_logos/python-logo-master-v3-TM.psd -------------------------------------------------------------------------------- /static/community_logos/python-powered-h-100x130.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/community_logos/python-powered-h-100x130.png -------------------------------------------------------------------------------- /static/community_logos/python-powered-h-140x182.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/community_logos/python-powered-h-140x182.png -------------------------------------------------------------------------------- /static/community_logos/python-powered-w-100x40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/community_logos/python-powered-w-100x40.png -------------------------------------------------------------------------------- /static/community_logos/python-powered-w-140x56.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/community_logos/python-powered-w-140x56.png -------------------------------------------------------------------------------- /static/community_logos/python-powered-w-200x80.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/community_logos/python-powered-w-200x80.png -------------------------------------------------------------------------------- /membership/urls.py: -------------------------------------------------------------------------------- 1 | from . import views 2 | from django.urls import path 3 | 4 | 5 | urlpatterns = [ 6 | path('', views.Membership.as_view(), name='membership'), 7 | ] 8 | -------------------------------------------------------------------------------- /static/community_logos/python-logo-master-v3-TM-flattened.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/python/pythondotorg/HEAD/static/community_logos/python-logo-master-v3-TM-flattened.png -------------------------------------------------------------------------------- /pages/urls.py: -------------------------------------------------------------------------------- 1 | from .views import PageView 2 | from django.urls import path 3 | 4 | urlpatterns = [ 5 | path('/', PageView.as_view(), name='page_detail'), 6 | ] 7 | -------------------------------------------------------------------------------- /templates/community/types/link.html: -------------------------------------------------------------------------------- 1 |

todo: types/link.html - {{ object }}

2 | {% for link in object.related_link.all %} 3 | {% endfor %} 4 | -------------------------------------------------------------------------------- /Dockerfile.static: -------------------------------------------------------------------------------- 1 | FROM ruby:2.7.8-bullseye AS static 2 | 3 | RUN mkdir /code 4 | WORKDIR /code 5 | 6 | COPY Gemfile Gemfile.lock /code/ 7 | 8 | RUN bundle install 9 | 10 | COPY . /code 11 | -------------------------------------------------------------------------------- /templates/users/membership_vote_affirm_done.html: -------------------------------------------------------------------------------- 1 | {% extends "users/base.html" %} 2 | 3 | {% block user_content %} 4 |

Your vote affirmation has been recorded

5 | 6 | {% endblock user_content %} -------------------------------------------------------------------------------- /templates/search/includes/pages.page.html: -------------------------------------------------------------------------------- 1 | {% load highlight %} 2 |

{{ result.title }}

3 |

4 | {% highlight result.text with query max_length 500 %} 5 |

6 | -------------------------------------------------------------------------------- /infra/config.tf: -------------------------------------------------------------------------------- 1 | # Connect us to TF Cloud for remote deploys 2 | terraform { 3 | cloud { 4 | organization = "psf" 5 | workspaces { 6 | name = "pythondotorg-infra" 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /pydotorg/compilers.py: -------------------------------------------------------------------------------- 1 | from pipeline.compilers import sass 2 | 3 | 4 | class DummySASSCompiler(sass.SASSCompiler): 5 | 6 | def compile_file(self, infile, outfile, outdated=False, force=False): 7 | pass 8 | -------------------------------------------------------------------------------- /templates/search/indexes/events/calendar_text.txt: -------------------------------------------------------------------------------- 1 | {{ object.name }} 2 | {{ object.description }} 3 | {{ object.name }} 4 | {{ object.description }} 5 | {{ object.name }} 6 | {{ object.description }} 7 | {{ object.path }} -------------------------------------------------------------------------------- /codesamples/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import CodeSample 4 | from cms.admin import ContentManageableModelAdmin 5 | 6 | 7 | admin.site.register(CodeSample, ContentManageableModelAdmin) 8 | -------------------------------------------------------------------------------- /static/js/libs/html-includes.js: -------------------------------------------------------------------------------- 1 | // Look for any data-html-include elements, and include the content for them 2 | $('[data-html-include]').each(function() { 3 | $(this).load($(this).data('html-include')); 4 | }); 5 | -------------------------------------------------------------------------------- /templates/sitetree/sidebar_menu_root.html: -------------------------------------------------------------------------------- 1 | {% load sitetree %} 2 | 3 | {% if sitetree_items %} 4 | 8 | {% endif %} 9 | -------------------------------------------------------------------------------- /users/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class UsersAppConfig(AppConfig): 5 | 6 | name = 'users' 7 | verbose_name = 'Users' 8 | 9 | def ready(self): 10 | import users.listeners 11 | -------------------------------------------------------------------------------- /banners/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from banners.models import Banner 4 | 5 | 6 | @admin.register(Banner) 7 | class BannerAdmin(admin.ModelAdmin): 8 | list_display = ("title", "active", "psf_pages_only") 9 | -------------------------------------------------------------------------------- /templates/events/eventcategory_list.html: -------------------------------------------------------------------------------- 1 | {% extends "waitforit.html" %} 2 | 3 | {% comment %} 4 | {% extends "base.html" %} 5 | 6 | {% block body_attributes %}class="python events list-categories"{% endblock %} 7 | {% endcomment %} 8 | -------------------------------------------------------------------------------- /jobs/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class JobsAppConfig(AppConfig): 5 | 6 | name = 'jobs' 7 | verbose_name = 'Jobs Application' 8 | 9 | def ready(self): 10 | import jobs.listeners 11 | -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | group :media do 4 | gem "compass", "~>0.12.7" 5 | gem "sass", "~>3.2.19" 6 | gem "susy", "~>1.0.9" 7 | end 8 | 9 | group :development do 10 | gem "foreman", "~>0.61.0" 11 | end 12 | -------------------------------------------------------------------------------- /boxes/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from cms.admin import ContentManageableModelAdmin 3 | from .models import Box 4 | 5 | 6 | @admin.register(Box) 7 | class BoxAdmin(ContentManageableModelAdmin): 8 | ordering = ('label', ) 9 | -------------------------------------------------------------------------------- /templates/pypl/index.html: -------------------------------------------------------------------------------- 1 | {# ===== PyPl LANDING PAGE ===== #} 2 | 3 | {% extends "waitforit.html" %} 4 | 5 | 6 | {% block body_attributes %}class="pypl"{% endblock %} 7 | 8 | 9 | {% block main-nav_attributes %}pypl-navigation{% endblock %} 10 | -------------------------------------------------------------------------------- /templates/search/indexes/events/event_text.txt: -------------------------------------------------------------------------------- 1 | {{ object.title }} 2 | {{ object.name }} 3 | {{ object.venue }} 4 | {{ object.title }} 5 | {{ object.name }} 6 | {{ object.venue }} 7 | {{ object.description }} 8 | {{ object.description }} 9 | 10 | -------------------------------------------------------------------------------- /templates/shop/index.html: -------------------------------------------------------------------------------- 1 | {# ===== SHOP LANDING PAGE ===== #} 2 | 3 | {% extends "waitforit.html" %} 4 | 5 | 6 | {% block body_attributes %}class="shop"{% endblock %} 7 | 8 | 9 | {% block main-nav_attributes %}shop-navigation{% endblock %} 10 | -------------------------------------------------------------------------------- /templates/components/psf-widget.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | {% load boxes %} 5 | {% box 'widget-about-psf' %} 6 |
7 | -------------------------------------------------------------------------------- /boxes/views.py: -------------------------------------------------------------------------------- 1 | from django.http import HttpResponse 2 | from django.shortcuts import get_object_or_404 3 | from .models import Box 4 | 5 | def box(request, label): 6 | b = get_object_or_404(Box, label=label) 7 | return HttpResponse(b.content.rendered) 8 | -------------------------------------------------------------------------------- /nominations/templatetags/nominations.py: -------------------------------------------------------------------------------- 1 | import random 2 | from django import template 3 | 4 | register = template.Library() 5 | 6 | 7 | @register.filter 8 | def shuffle(arg): 9 | aux = list(arg)[:] 10 | random.shuffle(aux) 11 | return aux 12 | -------------------------------------------------------------------------------- /templates/docs/index.html: -------------------------------------------------------------------------------- 1 | {# ===== DOCS LANDING PAGE ===== #} 2 | 3 | {% extends "waitforit.html" %} 4 | 5 | 6 | {% block body_attributes %}class="python docs"{% endblock %} 7 | 8 | 9 | {% block main-nav_attributes %}python-navigation{% endblock %} 10 | -------------------------------------------------------------------------------- /community/urls.py: -------------------------------------------------------------------------------- 1 | from . import views 2 | from django.urls import path 3 | 4 | app_name = 'community' 5 | urlpatterns = [ 6 | path('', views.PostList.as_view(), name='post_list'), 7 | path('/', views.PostDetail.as_view(), name='post_detail'), 8 | ] 9 | -------------------------------------------------------------------------------- /prod-requirements.txt: -------------------------------------------------------------------------------- 1 | gunicorn==23.0.0 2 | 3 | sentry-sdk[django]==2.40.0 4 | 5 | # Heroku 6 | Whitenoise==6.11.0 # 6.4.0 is first version that supports Django 4.2 7 | django-storages==1.14.4 # 1.14.4 is first version that supports Django 4.2 8 | boto3==1.26.165 9 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | release: python manage.py migrate --noinput 2 | web: bin/start-nginx gunicorn -c gunicorn.conf pydotorg.wsgi 3 | worker: celery -A pydotorg worker -l INFO 4 | worker-beat: celery -A pydotorg beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler 5 | -------------------------------------------------------------------------------- /community/views.py: -------------------------------------------------------------------------------- 1 | from django.views.generic import ListView, DetailView 2 | 3 | from .models import Post 4 | 5 | 6 | class PostList(ListView): 7 | model = Post 8 | paginate_by = 25 9 | 10 | 11 | class PostDetail(DetailView): 12 | model = Post 13 | -------------------------------------------------------------------------------- /pages/managers.py: -------------------------------------------------------------------------------- 1 | from django.db.models.query import QuerySet 2 | 3 | 4 | class PageQuerySet(QuerySet): 5 | def published(self): 6 | return self.filter(is_published=True) 7 | 8 | def draft(self): 9 | return self.filter(is_published=False) 10 | -------------------------------------------------------------------------------- /infra/.gitignore: -------------------------------------------------------------------------------- 1 | 2 | **/.terraform/* 3 | *.tfstate 4 | *.tfstate.* 5 | crash.log 6 | crash.*.log 7 | *.tfvars 8 | *.tfvars.json 9 | override.tf 10 | override.tf.json 11 | *_override.tf 12 | *_override.tf.json 13 | .terraform.tfstate.lock.info 14 | .terraformrc 15 | terraform.rc -------------------------------------------------------------------------------- /infra/cdn/versions.tf: -------------------------------------------------------------------------------- 1 | terraform { 2 | required_providers { 3 | fastly = { 4 | source = "fastly/fastly" 5 | version = "5.13.0" 6 | } 7 | sigsci = { 8 | source = "signalsciences/sigsci" 9 | version = "3.3.0" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /templates/jobs/job_type_list.html: -------------------------------------------------------------------------------- 1 | {% extends "jobs/job_list.html" %} 2 | 3 | {% block header_message %}{{ current_type.name }}{% endblock %} 4 | {% block header_action %}{{ object_list|length }} Python job{{ object_list|length|pluralize }} in {{ current_type.name }}{% endblock %} 5 | -------------------------------------------------------------------------------- /codesamples/managers.py: -------------------------------------------------------------------------------- 1 | from django.db.models.query import QuerySet 2 | 3 | 4 | class CodeSampleQuerySet(QuerySet): 5 | def draft(self): 6 | return self.filter(is_published=False) 7 | 8 | def published(self): 9 | return self.filter(is_published=True) 10 | -------------------------------------------------------------------------------- /pydotorg/tests/test_classes.py: -------------------------------------------------------------------------------- 1 | from django.template import Template, Context 2 | from django.test import TestCase 3 | 4 | 5 | class TemplateTestCase(TestCase): 6 | def render_string(self, content, context): 7 | t = Template(content) 8 | return t.render(Context(context)) 9 | -------------------------------------------------------------------------------- /templates/jobs/job_category_list.html: -------------------------------------------------------------------------------- 1 | {% extends "jobs/job_list.html" %} 2 | 3 | {% block header_message %}{{ current_category.name }}{% endblock %} 4 | {% block header_action %}{{ object_list|length }} Python job{{ object_list|length|pluralize }} in {{ current_category.name }}{% endblock %} 5 | -------------------------------------------------------------------------------- /fixtures/README.md: -------------------------------------------------------------------------------- 1 | `boxes.json` is not actually a Django fixture file. It's mainly used by 2 | the `initial_data` function in `boxes/factories.py`. 3 | 4 | We still use `sitetree_menus.json` fixture because it's hard to create 5 | its data via `factory_boy` or programmatically by using its API. 6 | -------------------------------------------------------------------------------- /dev-requirements.txt: -------------------------------------------------------------------------------- 1 | -r base-requirements.txt 2 | 3 | # Required for running tests 4 | 5 | factory-boy==3.3.1 6 | Faker==0.8.1 7 | tblib==1.7.0 8 | responses==0.13.3 9 | 10 | # Extra stuff required for local dev 11 | 12 | django-debug-toolbar==3.2.1 13 | coverage 14 | ddt 15 | model-bakery==1.4.0 16 | -------------------------------------------------------------------------------- /jobs/migrations/0014_merge.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('jobs', '0013_auto_20170810_1627'), 8 | ('jobs', '0013_auto_20170810_1625'), 9 | ] 10 | 11 | operations = [ 12 | ] 13 | -------------------------------------------------------------------------------- /templates/cms/iso_time_tag.html: -------------------------------------------------------------------------------- 1 | {% comment %} 2 | Returns an ISO date, with the year tagged in a say-no-more span. 3 | 4 | This allows the date representation to shrink to just MM-DD. 5 | {% endcomment %} 6 | 7 | -------------------------------------------------------------------------------- /templates/downloads/homepage-downloads-box.html: -------------------------------------------------------------------------------- 1 |

Download

2 |

Python source code and installers are available for download for all versions!

3 |

Latest: {{ latest_python3.name }}

-------------------------------------------------------------------------------- /templates/jobs/job_telecommute_list.html: -------------------------------------------------------------------------------- 1 | {% extends "jobs/job_list.html" %} 2 | 3 | {% block header_message %} 4 | Telecommute Jobs 5 | {% endblock %} 6 | 7 | {% block header_action %} 8 | {{ object_list|length }} Python job{{ object_list|length|pluralize }} that offer telecommuting 9 | {% endblock %} 10 | -------------------------------------------------------------------------------- /templates/sponsors/email/psf_new_application.txt: -------------------------------------------------------------------------------- 1 | {% load sponsors %} 2 | A new sponsorship application has been submitted! 3 | 4 | View the application at {% if request.is_secure %}https://{% else %}http://{% endif %}{{ request.get_host }}{{ sponsorship.admin_url }} 5 | 6 | Details: 7 | 8 | {% full_sponsorship sponsorship %} 9 | -------------------------------------------------------------------------------- /templates/search/includes/jobs.job.html: -------------------------------------------------------------------------------- 1 |

Job - {{ result.name }}

2 | 3 |

Location: {{ result.city }}{% if result.region %}, {{ result.region }}{% endif %} {{ result.country }}

4 | 5 | {% if result.telecommuting %}

Telecommuting: Yes

{% endif %} 6 |

{{ result.description|safe }}

-------------------------------------------------------------------------------- /templates/sponsors/admin/sponsors_sponsorshipcurrentyear_changelist.html: -------------------------------------------------------------------------------- 1 | {% extends 'admin/change_list.html' %} 2 | 3 | {% block object-tools-items %} 4 |
  • 5 | 6 | Clone Application Configuration 7 | 8 |
  • 9 | {% endblock %} 10 | -------------------------------------------------------------------------------- /companies/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from cms.admin import NameSlugAdmin 4 | 5 | from .models import Company 6 | 7 | 8 | @admin.register(Company) 9 | class CompanyAdmin(NameSlugAdmin): 10 | search_fields = ['name'] 11 | list_display = ['__str__', 'contact', 'email'] 12 | ordering = ['-pk'] 13 | -------------------------------------------------------------------------------- /infra/cdn/providers.tf: -------------------------------------------------------------------------------- 1 | provider "fastly" { 2 | alias = "cdn" 3 | api_key = var.fastly_key 4 | } 5 | 6 | provider "sigsci" { 7 | alias = "firewall" 8 | corp = var.ngwaf_corp_name 9 | email = var.ngwaf_email 10 | auth_token = var.ngwaf_token 11 | fastly_api_key = var.fastly_key 12 | } 13 | -------------------------------------------------------------------------------- /templates/sitetree/footer_children.html: -------------------------------------------------------------------------------- 1 | {% load sitetree %} 2 | 3 | 8 | -------------------------------------------------------------------------------- /community/managers.py: -------------------------------------------------------------------------------- 1 | from django.db.models.query import QuerySet 2 | 3 | 4 | class PostQuerySet(QuerySet): 5 | 6 | def public(self): 7 | return self.filter(status__exact=self.model.STATUS_PUBLIC) 8 | 9 | def private(self): 10 | return self.filter(status__in=[ 11 | self.model.STATUS_PRIVATE, 12 | ]) 13 | -------------------------------------------------------------------------------- /templates/admin/base_site.html: -------------------------------------------------------------------------------- 1 | {% extends "admin_interface:admin/base_site.html" %} 2 | {% load i18n %} 3 | 4 | {% block title %}{{ title }} | {% trans 'python.org' %}{% endblock %} 5 | 6 | {% block branding %} 7 |

    {% trans 'python.org administration' %}

    8 | {% endblock %} 9 | 10 | {% block nav-global %}{% endblock %} 11 | -------------------------------------------------------------------------------- /jobs/signals.py: -------------------------------------------------------------------------------- 1 | from django.dispatch import Signal 2 | 3 | # Sent after job offer was submitted for review 4 | job_was_submitted = Signal() 5 | # Sent after job offer was approved 6 | job_was_approved = Signal() 7 | # Sent after job offer was rejected 8 | job_was_rejected = Signal() 9 | # Sent after comment was posted 10 | comment_was_posted = Signal() 11 | -------------------------------------------------------------------------------- /minutes/managers.py: -------------------------------------------------------------------------------- 1 | from django.db.models.query import QuerySet 2 | 3 | 4 | class MinutesQuerySet(QuerySet): 5 | def draft(self): 6 | return self.filter(is_published=False) 7 | 8 | def published(self): 9 | return self.filter(is_published=True) 10 | 11 | def latest(self): 12 | return self.published().order_by('-date') 13 | -------------------------------------------------------------------------------- /templates/blogs/supernav.html: -------------------------------------------------------------------------------- 1 |
  • 2 |

    {{ entry.pub_date|date:"l, F j, Y" }}

    3 |

    {{ entry.title }}

    4 |

    5 | {{ entry.summary|truncatewords_html:50|striptags|safe }}Read more 6 |

    7 |
  • 8 | -------------------------------------------------------------------------------- /templates/sitetree/submenu_children.html: -------------------------------------------------------------------------------- 1 | {% load sitetree %} 2 | 3 | 8 | -------------------------------------------------------------------------------- /templates/search/includes/downloads.release.html: -------------------------------------------------------------------------------- 1 |

    Release – {{ result.name }}

    2 |

    Version: {{ result.version }}

    3 |

    Released: {{ result.release_date|date }}

    4 |

    {{ result.description|safe }}

    5 | {% if result.release_notes_url %} 6 |

    View Release Notes

    7 | {% endif %} 8 | -------------------------------------------------------------------------------- /users/listeners.py: -------------------------------------------------------------------------------- 1 | from django.db.models.signals import post_save 2 | from django.dispatch import receiver 3 | 4 | from rest_framework.authtoken.models import Token 5 | 6 | from .models import User 7 | 8 | 9 | @receiver(post_save, sender=User) 10 | def create_auth_token(sender, instance, created, **kwargs): 11 | if created: 12 | Token.objects.create(user=instance) 13 | -------------------------------------------------------------------------------- /static/img/sponsors/title-1.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sponsors/migrations/0023_merge_20210406_1522.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2021-04-06 15:22 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0022_sponsorcontact_administrative'), 10 | ('sponsors', '0020_sponsorshipbenefit_unavailable'), 11 | ] 12 | 13 | operations = [ 14 | ] 15 | -------------------------------------------------------------------------------- /successstories/migrations/0007_remove_story_weight.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('successstories', '0006_auto_20170726_0824'), 8 | ] 9 | 10 | operations = [ 11 | migrations.RemoveField( 12 | model_name='story', 13 | name='weight', 14 | ), 15 | ] 16 | -------------------------------------------------------------------------------- /minutes/urls.py: -------------------------------------------------------------------------------- 1 | from .feeds import MinutesFeed 2 | from . import views 3 | from django.urls import path, re_path 4 | 5 | 6 | urlpatterns = [ 7 | path('', views.MinutesList.as_view(), name='minutes_list'), 8 | path('feed/', MinutesFeed(), name='minutes_feed'), 9 | re_path(r'^(?P[0-9]{4})-(?P[0-9]{2})-(?P[0-9]{2})/$', views.MinutesDetail.as_view(), name='minutes_detail'), 10 | ] 11 | -------------------------------------------------------------------------------- /sponsors/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | 6 | urlpatterns = [ 7 | path('application/new/', views.NewSponsorshipApplicationView.as_view(), 8 | name="new_sponsorship_application", 9 | ), 10 | path('application/', views.SelectSponsorshipApplicationBenefitsView.as_view(), 11 | name="select_sponsorship_application_benefits", 12 | ), 13 | ] 14 | -------------------------------------------------------------------------------- /templates/403.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block body_attributes %}class="python default-page fourohthree"{% endblock %} 4 | 5 | {% block content %} 6 | 7 |
    8 | 9 |

    Error 403: Permission denied

    10 | 11 |

    Unfortunately, you don't have enough privileges to access this page.

    12 | 13 |
    14 | 15 | {% endblock %} 16 | -------------------------------------------------------------------------------- /templates/sponsors/email/sponsor_expiring_assets.txt: -------------------------------------------------------------------------------- 1 | Hello {{ sponsorship.sponsor.name }} team! 2 | 3 | Your sponsorship requires one or more submissions by {{ due_date|date }} in order for us to fulfill your benefits: 4 | 5 | You can submit your assets via the following link: 6 | 7 | https://python.org{% url "users:update_sponsorship_assets" sponsorship.pk %} 8 | 9 | Thanks, 10 | Python Software Foundation 11 | -------------------------------------------------------------------------------- /jobs/migrations/0013_auto_20170810_1625.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('jobs', '0012_auto_20170809_1849'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterModelOptions( 12 | name='jobreviewcomment', 13 | options={'ordering': ('created',)}, 14 | ), 15 | ] 16 | -------------------------------------------------------------------------------- /jobs/migrations/0013_auto_20170810_1627.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('jobs', '0012_auto_20170809_1849'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterModelOptions( 12 | name='jobreviewcomment', 13 | options={'ordering': ('created',)}, 14 | ), 15 | ] 16 | -------------------------------------------------------------------------------- /templates/jobs/email/monthly_jobs_report.txt: -------------------------------------------------------------------------------- 1 | Of the {{ submissions_current_month }} Job submissions created in {% now "F Y" %}: 2 | {% for key, value in current_month_jobs.items %} 3 | - {{ value }} have status {{ key }}{% endfor %} 4 | 5 | For the {{ submissions_previous_month }} Job submissions created last month: 6 | {% for key, value in previous_month_jobs.items %} 7 | - {{ value }} have status {{ key }}{% endfor %} 8 | -------------------------------------------------------------------------------- /cms/templatetags/cms.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from django.utils.dateformat import format 3 | 4 | register = template.Library() 5 | 6 | 7 | @register.inclusion_tag('cms/iso_time_tag.html') 8 | def iso_time_tag(date): 9 | return { 10 | 'timestamp': format(date, 'c'), 11 | 'month': format(date, 'm'), 12 | 'day': format(date, 'd'), 13 | 'year': format(date, 'Y'), 14 | } 15 | -------------------------------------------------------------------------------- /mailing/tests/models.py: -------------------------------------------------------------------------------- 1 | """Models to be used in mailing tests.""" 2 | 3 | from mailing.models import BaseEmailTemplate 4 | 5 | 6 | class MockEmailTemplate(BaseEmailTemplate): 7 | """Mock model for BaseEmailTemplate to use in tests.""" 8 | 9 | class Meta: 10 | """Metaclass for MockEmailTemplate to avoid creating a table in the database.""" 11 | app_label = 'mailing' 12 | managed = False 13 | -------------------------------------------------------------------------------- /static/img/sponsors/title-4.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /membership/views.py: -------------------------------------------------------------------------------- 1 | from django.views.generic import TemplateView 2 | 3 | from pydotorg.mixins import FlagMixin 4 | 5 | # NOTE: Many aspects of 'membership' such as adjusting a user profile, signup, 6 | # etc are handled in the users app 7 | 8 | 9 | class Membership(FlagMixin, TemplateView): 10 | """ Main membership landing page """ 11 | flag = 'psf_membership' 12 | template_name = 'users/membership.html' 13 | -------------------------------------------------------------------------------- /templates/search/indexes/jobs/job_text.txt: -------------------------------------------------------------------------------- 1 | job 2 | {{ object.job_title }} 3 | {{ object.company_name }} 4 | {{ object.city }} {{ object.region }} {{ object.country }} 5 | {{ object.description }} 6 | {{ object.requirements }} 7 | {{ object.category.name }} 8 | {{ object.company_description }} 9 | {% if object.telecommuting %}telecommute remote work{% endif %} 10 | {% for t in object.job_types.all %} 11 | {{ t.name }} 12 | {% endfor %} -------------------------------------------------------------------------------- /mailing/tests/forms.py: -------------------------------------------------------------------------------- 1 | """Forms to be used in mailing tests.""" 2 | 3 | from mailing.forms import BaseEmailTemplateForm 4 | from mailing.tests.models import MockEmailTemplate 5 | 6 | 7 | class TestBaseEmailTemplateForm(BaseEmailTemplateForm): 8 | """Base email template form for testing.""" 9 | 10 | class Meta: 11 | """Metaclass for the form.""" 12 | model = MockEmailTemplate 13 | fields = "__all__" 14 | -------------------------------------------------------------------------------- /companies/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | from . import admin # coverage FTW 4 | from .templatetags.companies import render_email 5 | 6 | 7 | class CompaniesTagsTests(TestCase): 8 | def test_render_email(self): 9 | self.assertEqual(render_email(''), None) 10 | self.assertEqual(render_email('firstname.lastname@domain.com'), 'firstname.lastname@domain.com') 11 | -------------------------------------------------------------------------------- /templates/search/includes/events.calendar.html: -------------------------------------------------------------------------------- 1 |

    Calendar – {{ result.name }}

    2 |

    {{ result.description|safe }}

    3 | {% if result.rss %} 4 |

    RSS Feed

    5 | {% endif %} 6 | {% if result.twitter %} 7 |

    Twitter Feed

    8 | {% endif %} 9 | {% if result.ical %} 10 |

    iCal

    11 | {% endif %} 12 | -------------------------------------------------------------------------------- /blogs/factories.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | 3 | from .models import Feed 4 | 5 | 6 | def initial_data(): 7 | feed, _ = Feed.objects.get_or_create( 8 | id=1, 9 | defaults={ 10 | 'name': 'Python Insider', 11 | 'website_url': settings.PYTHON_BLOG_URL, 12 | 'feed_url': settings.PYTHON_BLOG_FEED_URL, 13 | } 14 | ) 15 | return { 16 | 'feeds': [feed], 17 | } 18 | -------------------------------------------------------------------------------- /jobs/migrations/0015_auto_20170814_0301.py: -------------------------------------------------------------------------------- 1 | from django.db import migrations, models 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('jobs', '0014_merge'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='job', 13 | name='email', 14 | field=models.EmailField(max_length=254, verbose_name='Contact email'), 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /templates/python/shell.html: -------------------------------------------------------------------------------- 1 | {% extends "python/index.html" %} 2 | 3 | {% block body_attributes %}class="python home shell-active"{% endblock %} 4 | 5 | {% block header_content %} 6 |
    7 | 8 | 9 | 10 |
    11 | 12 | {% endblock header_content %} 13 | -------------------------------------------------------------------------------- /sponsors/migrations/0024_auto_20210414_1449.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2021-04-14 14:49 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0023_merge_20210406_1522'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RenameModel( 14 | old_name='StatementOfWork', 15 | new_name='Contract', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /successstories/migrations/0008_auto_20170821_2000.py: -------------------------------------------------------------------------------- 1 | from django.db import migrations, models 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('successstories', '0007_remove_story_weight'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='story', 13 | name='name', 14 | field=models.CharField(max_length=200), 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /templates/sponsors/admin/sponsorshipbenefit_change_form.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/change_form.html" %} 2 | {% load i18n admin_urls %} 3 | 4 | {% block object-tools-items %} 5 | {% with original as benefit %} 6 | 7 |
  • 8 | Update Sponsorships 9 |
  • 10 | 11 | {% endwith %} 12 | 13 | {{ block.super }} 14 | {% endblock %} 15 | -------------------------------------------------------------------------------- /gunicorn.conf: -------------------------------------------------------------------------------- 1 | bind = 'unix:/var/run/cabotage/nginx.sock' 2 | backlog = 1024 3 | preload_app = True 4 | max_requests = 2048 5 | max_requests_jitter = 128 6 | 7 | worker_connections = 1000 8 | timeout = 60 9 | keepalive = 2 10 | 11 | errorlog = '-' 12 | loglevel = 'info' 13 | accesslog = '-' 14 | access_log_format = '%(h)s %(l)s %(u)s %(t)s "%(r)s" %(s)s %(b)s "%(f)s" "%(a)s"' 15 | 16 | def when_ready(server): 17 | open('/tmp/app-initialized', 'w').close() 18 | -------------------------------------------------------------------------------- /successstories/urls.py: -------------------------------------------------------------------------------- 1 | from . import views 2 | from django.urls import path 3 | 4 | 5 | urlpatterns = [ 6 | path('', views.StoryList.as_view(), name='success_story_list'), 7 | path('create/', views.StoryCreate.as_view(), name='success_story_create'), 8 | path('/', views.StoryDetail.as_view(), name='success_story_detail'), 9 | path('category//', views.StoryListCategory.as_view(), name='success_story_list_category'), 10 | ] 11 | -------------------------------------------------------------------------------- /templates/downloads/download-sources-box.html: -------------------------------------------------------------------------------- 1 |

    Sources

    2 |

    For most Unix systems, you must download and compile the source code. The same source code archive can also be used to build the Windows and Mac versions, and is the starting point for ports to all other platforms.

    3 | 4 |

    Download the latest Python 3 source.

    5 | 6 |

    Read more

    -------------------------------------------------------------------------------- /templates/users/membership_vote_affirm.html: -------------------------------------------------------------------------------- 1 | {% extends "users/base.html" %} 2 | 3 | {% block user_content %} 4 |

    Reaffirm your desire to be a PSF Voting Member

    5 | 6 |

    Your last affirmation was on {{ request.user.membership.last_vote_affirmation|date }}.

    7 | 8 |
    {% csrf_token %} 9 | 10 | Cancel 11 |
    12 | {% endblock user_content %} -------------------------------------------------------------------------------- /companies/migrations/0003_auto_20170814_0301.py: -------------------------------------------------------------------------------- 1 | from django.db import migrations, models 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('companies', '0002_auto_20150416_1853'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='company', 13 | name='email', 14 | field=models.EmailField(max_length=254, null=True, blank=True), 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /downloads/migrations/0004_auto_20170821_2000.py: -------------------------------------------------------------------------------- 1 | from django.db import migrations, models 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('downloads', '0003_auto_20150824_1612'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='release', 13 | name='_content_rendered', 14 | field=models.TextField(editable=False, default=''), 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /events/templatetags/events.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from django.utils import timezone 3 | 4 | from ..models import Event 5 | 6 | 7 | register = template.Library() 8 | 9 | 10 | @register.simple_tag 11 | def get_events_upcoming(limit=5, only_featured=False): 12 | qs = Event.objects.for_datetime(timezone.now()).order_by( 13 | 'occurring_rule__dt_start') 14 | if only_featured: 15 | qs = qs.filter(featured=True) 16 | return qs[:limit] 17 | -------------------------------------------------------------------------------- /.readthedocs.yaml: -------------------------------------------------------------------------------- 1 | # Read the Docs configuration file 2 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details 3 | # Project page: https://readthedocs.org/projects/pythondotorg/ 4 | 5 | version: 2 6 | 7 | build: 8 | os: ubuntu-22.04 9 | tools: 10 | python: "3" 11 | 12 | commands: 13 | - python -m pip install -r docs-requirements.txt 14 | - make -C docs html JOBS=$(nproc) BUILDDIR=_readthedocs 15 | - mv docs/_readthedocs _readthedocs 16 | -------------------------------------------------------------------------------- /sponsors/migrations/0086_auto_20220809_1655.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2022-08-09 16:55 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0085_auto_20220730_0945'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='sponsorshippackage', 15 | options={'ordering': ('-year', 'order')}, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /templates/500.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block body_attributes %}class="python default-page fivehundred"{% endblock %} 4 | 5 | {% block content %} 6 | 7 |
    8 | 9 |

    Error 500: File not Found

    10 | 11 |

    We couldn’t find what you were looking for. This error has been reported and we will look into it shortly.

    12 | 13 |
    14 | 15 | {% endblock %} -------------------------------------------------------------------------------- /pydotorg/celery.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | from celery import Celery 4 | from django.core import management 5 | 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "pydotorg.settings.local") 7 | 8 | app = Celery("pydotorg") 9 | app.config_from_object("django.conf:settings", namespace="CELERY") 10 | 11 | @app.task(bind=True) 12 | def run_management_command(self, command_name, args, kwargs): 13 | management.call_command(command_name, *args, **kwargs) 14 | 15 | app.autodiscover_tasks() 16 | -------------------------------------------------------------------------------- /templates/jobs/email/comment_was_posted_admin.txt: -------------------------------------------------------------------------------- 1 | Dear Python Job Board Admin, 2 | 3 | There is a new review comment available for a job posting. 4 | 5 | Title: {{ content_object.job_title }} 6 | Company: {{ content_object.company_name }} 7 | URL: https://{{ site.domain }}{{ content_object.get_absolute_url }} 8 | Posted: {{ content_object.created|date:"d F Y" }} 9 | 10 | --- Comment: --- 11 | 12 | {{ comment|safe }} 13 | 14 | -- 15 | Kind regards, 16 | {{ submitter_name }} 17 | -------------------------------------------------------------------------------- /templates/mailing/admin/base_email_template_form.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/change_form.html" %} 2 | {% load i18n admin_urls %} 3 | 4 | {% block object-tools-items %} 5 | {% with original as email_template %} 6 | 7 | {% if email_template %} 8 |
  • 9 | Preview 10 |
  • 11 | {% endif %} 12 | 13 | {% endwith %} 14 | 15 | {{ block.super }} 16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /pages/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | 3 | from .models import Page 4 | 5 | 6 | class PageSerializer(serializers.HyperlinkedModelSerializer): 7 | 8 | class Meta: 9 | model = Page 10 | fields = ( 11 | 'title', 12 | 'path', 13 | 'keywords', 14 | 'description', 15 | 'content', 16 | 'is_published', 17 | 'template_name', 18 | 'resource_uri', 19 | ) 20 | -------------------------------------------------------------------------------- /events/migrations/0005_auto_20170821_2000.py: -------------------------------------------------------------------------------- 1 | from django.db import migrations, models 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('events', '0004_auto_20170814_0519'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='event', 13 | name='categories', 14 | field=models.ManyToManyField(related_name='events', to='events.EventCategory', blank=True), 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /jobs/migrations/0006_region_nullable.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('jobs', '0005_job_other_job_type'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='job', 13 | name='region', 14 | field=models.CharField(blank=True, max_length=100, null=True), 15 | preserve_default=True, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /templates/jobs/email/comment_was_posted.txt: -------------------------------------------------------------------------------- 1 | Dear {{ user_name }}, 2 | 3 | There is a new review comment available for your job posting. 4 | 5 | Title: {{ content_object.job_title }} 6 | Company: {{ content_object.company_name }} 7 | URL: https://{{ site.domain }}{{ content_object.get_absolute_url }} 8 | Posted: {{ content_object.created|date:"d F Y" }} 9 | 10 | --- Comment: --- 11 | 12 | {{ comment|safe }} 13 | 14 | -- 15 | Kind regards, 16 | {{ reviewer_name }} 17 | Python Job Board 18 | -------------------------------------------------------------------------------- /sponsors/migrations/0043_auto_20210827_1343.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2021-08-27 13:43 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0042_auto_20210827_1318'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RenameField( 14 | model_name='sponsorship', 15 | old_name='level_name', 16 | new_name='level_name_old', 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /static/img/sponsors/title-2.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.coveragerc: -------------------------------------------------------------------------------- 1 | [run] 2 | branch = True 3 | source = . 4 | omit = 5 | *venv* 6 | manage.py 7 | pydotorg/wsgi.py 8 | pydotorg/settings/* 9 | pydotorg/compilers.py 10 | */migrations/* 11 | */tests/* 12 | */tests.py 13 | */actions.py 14 | */admin.py 15 | */factories.py 16 | */search_indexes.py 17 | 18 | [report] 19 | exclude_lines = 20 | def get_absolute_url 21 | def __repr__ 22 | def __str__ 23 | if settings.DEBUG 24 | if __name__ == .__main__.: 25 | -------------------------------------------------------------------------------- /jobs/migrations/0020_auto_20191101_1601.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2019-11-01 16:01 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('jobs', '0019_job_submitted_by'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='job', 15 | name='url', 16 | field=models.URLField(null=True, verbose_name='URL'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /sponsors/migrations/0059_auto_20211029_1503.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-10-29 15:03 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0058_auto_20211029_1427'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='textasset', 15 | options={'verbose_name': 'Text Asset', 'verbose_name_plural': 'Text Assets'}, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /sponsors/migrations/0082_auto_20220729_1613.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2022-07-29 16:13 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0081_sponsorship_application_year'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RenameField( 14 | model_name='sponsorship', 15 | old_name='application_year', 16 | new_name='year', 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /successstories/migrations/0004_auto_20170724_0507.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('successstories', '0003_auto_20170720_1655'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='story', 13 | name='company_url', 14 | field=models.URLField(verbose_name='Company URL'), 15 | preserve_default=True, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /sponsors/migrations/0036_auto_20210826_1930.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2021-08-26 19:30 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0035_auto_20210826_1929'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='sponsorship', 15 | options={'permissions': [('sponsor_publisher', 'Can access sponsor placement API')]}, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /boxes/templatetags/boxes.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from django import template 4 | from django.utils.html import mark_safe 5 | 6 | from ..models import Box 7 | 8 | log = logging.getLogger(__name__) 9 | register = template.Library() 10 | 11 | 12 | @register.simple_tag 13 | def box(label): 14 | try: 15 | return mark_safe(Box.objects.only('content').get(label=label).content.rendered) 16 | except Box.DoesNotExist: 17 | log.warning('WARNING: box not found: label=%s', label) 18 | return '' 19 | -------------------------------------------------------------------------------- /companies/migrations/0005_auto_20180705_0352.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.6 on 2018-07-05 03:52 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('companies', '0004_auto_20170821_2000'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='company', 15 | name='slug', 16 | field=models.SlugField(max_length=200, unique=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /sponsors/migrations/0097_sponsorship_renewal.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2023-12-18 16:23 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0096_auto_20231214_2108'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='sponsorship', 15 | name='renewal', 16 | field=models.BooleanField(blank=True, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /sponsors/migrations/0102_auto_20240509_2037.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.28 on 2024-05-09 20:37 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0101_sponsor_linked_in_page_url'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='textasset', 15 | name='text', 16 | field=models.TextField(blank=True, default=''), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /templates/events/email/new_event.txt: -------------------------------------------------------------------------------- 1 | The following event was submitted for approval: 2 | 3 | Name: {{ event.event_name }} 4 | Type: {{ event.event_type }} 5 | Focus: {{ event.python_focus }} 6 | Approximate Number of Attendees: {{ event.expected_attendees }} 7 | Location: {{ event.location }} 8 | Date/Time: {{ event.date_from }} - {{ event.date_to }} 9 | Recurrence: {{ event.recurrence }} 10 | Link: {{ event.event_name }} 11 | 12 | Description: 13 | {{ event.description }} 14 | -------------------------------------------------------------------------------- /community/tests/test_models.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | from ..models import Post 4 | 5 | 6 | class ModelTestCase(TestCase): 7 | 8 | def test_json_field(self): 9 | post = Post.objects.create( 10 | content='public post', 11 | media_type=Post.MEDIA_TEXT, 12 | status=Post.STATUS_PUBLIC, 13 | ) 14 | self.assertEqual(post.meta, {}) 15 | post.meta = {'SPAM': 42} 16 | post.save() 17 | self.assertEqual(post.meta, {'SPAM': 42}) 18 | -------------------------------------------------------------------------------- /users/migrations/0005_user_public_profile.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('users', '0004_auto_20150503_2100'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AddField( 12 | model_name='user', 13 | name='public_profile', 14 | field=models.BooleanField(verbose_name='Make my profile public', default=True), 15 | preserve_default=True, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /work_groups/migrations/0002_auto_20150604_2203.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('work_groups', '0001_initial'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='workgroup', 13 | name='url', 14 | field=models.URLField(help_text='Main URL for Group', verbose_name='URL', blank=True), 15 | preserve_default=True, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /work_groups/migrations/0004_auto_20180705_0352.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.6 on 2018-07-05 03:52 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('work_groups', '0003_auto_20170821_2000'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='workgroup', 15 | name='slug', 16 | field=models.SlugField(max_length=200, unique=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /jobs/migrations/0005_job_other_job_type.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('jobs', '0004_auto_20150216_1544'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AddField( 12 | model_name='job', 13 | name='other_job_type', 14 | field=models.CharField(max_length=100, verbose_name='Other Job Technologies', blank=True), 15 | preserve_default=True, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /events/migrations/0007_auto_20180705_0352.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.6 on 2018-07-05 03:52 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('events', '0006_change_end_date_for_occurring_rules'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='eventcategory', 15 | name='slug', 16 | field=models.SlugField(max_length=200, unique=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /sponsors/migrations/0057_auto_20211026_1529.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-10-26 15:29 2 | 3 | from django.db import migrations, models 4 | import uuid 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('sponsors', '0056_textasset'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='genericasset', 16 | name='uuid', 17 | field=models.UUIDField(default=uuid.uuid4, editable=False), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /static/img/sponsors/title-5.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /successstories/migrations/0005_auto_20170726_0645.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('successstories', '0004_auto_20170724_0507'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='story', 13 | name='name', 14 | field=models.CharField(max_length=200, help_text='Title of your success story'), 15 | preserve_default=True, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /sponsors/migrations/0012_sponsorship_for_modified_package.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2020-11-16 14:08 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ("sponsors", "0011_auto_20201111_1724"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name="sponsorship", 15 | name="for_modified_package", 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /users/migrations/0015_alter_user_first_name.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.11 on 2024-09-05 17:10 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('users', '0014_auto_20210801_2332'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='user', 15 | name='first_name', 16 | field=models.CharField(blank=True, max_length=150, verbose_name='first name'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /templates/jobs/email/job_was_submitted.txt: -------------------------------------------------------------------------------- 1 | The following job was submitted for approval: 2 | 3 | Title: {{ content_object.job_title }} 4 | Company: {{ content_object.company_name }} 5 | 6 | Posted: {{ content_object.created|date:"d F Y" }} 7 | Category: {{ content_object.category }} 8 | Contact: {{ content_object.contact }} <{{ content_object.email }}> 9 | 10 | Description: 11 | {{ content_object.description.raw|truncatewords:50 }} 12 | 13 | To view and review: 14 | 15 | URL: https://{{ site.domain }}{{ content_object.get_absolute_url }} 16 | -------------------------------------------------------------------------------- /downloads/migrations/0003_auto_20150824_1612.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('downloads', '0002_auto_20150416_1853'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='release', 13 | name='version', 14 | field=models.IntegerField(default=3, choices=[(3, 'Python 3.x.x'), (2, 'Python 2.x.x'), (1, 'Python 1.x.x')]), 15 | preserve_default=True, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /sponsors/migrations/0017_sponsorbenefit_added_by_user.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2020-11-20 14:43 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ("sponsors", "0016_auto_20201119_1448"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name="sponsorbenefit", 15 | name="added_by_user", 16 | field=models.BooleanField(default=False, verbose_name="Added by user?"), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /sponsors/migrations/0054_auto_20211026_1432.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-10-26 14:32 2 | 3 | from django.db import migrations, models 4 | import uuid 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('sponsors', '0053_genericasset_imgasset'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='genericasset', 16 | name='uuid', 17 | field=models.UUIDField(default=uuid.uuid4, editable=False, serialize=False), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /sponsors/migrations/0066_auto_20211223_1318.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-12-23 13:18 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0065_auto_20211223_1309'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='sponsorshippackage', 15 | name='slug', 16 | field=models.SlugField(help_text='Internal identifier used to reference this package.'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /templates/sitetree/footer.html: -------------------------------------------------------------------------------- 1 | {% load sitetree %} 2 | 3 | 13 | -------------------------------------------------------------------------------- /companies/factories.py: -------------------------------------------------------------------------------- 1 | import factory 2 | from factory.django import DjangoModelFactory 3 | 4 | from .models import Company 5 | 6 | 7 | class CompanyFactory(DjangoModelFactory): 8 | 9 | class Meta: 10 | model = Company 11 | django_get_or_create = ('name',) 12 | 13 | name = factory.Faker('company') 14 | contact = factory.Faker('name') 15 | email = factory.Faker('company_email') 16 | url = factory.Faker('url') 17 | 18 | 19 | def initial_data(): 20 | return { 21 | 'companies': CompanyFactory.create_batch(size=10), 22 | } 23 | -------------------------------------------------------------------------------- /minutes/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Minutes 4 | from cms.admin import ContentManageableModelAdmin 5 | 6 | 7 | @admin.register(Minutes) 8 | class MinutesAdmin(ContentManageableModelAdmin): 9 | date_hierarchy = 'date' 10 | 11 | def get_list_filter(self, request): 12 | fields = list(super().get_list_filter(request)) 13 | return fields + ['is_published'] 14 | 15 | def get_list_display(self, request): 16 | fields = list(super().get_list_display(request)) 17 | return fields + ['is_published'] 18 | -------------------------------------------------------------------------------- /sponsors/models/enums.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | 4 | class LogoPlacementChoices(Enum): 5 | SIDEBAR = "sidebar" 6 | SPONSORS_PAGE = "sponsors" 7 | JOBS = "jobs" 8 | BLOG = "blogpost" 9 | FOOTER = "footer" 10 | DOCS = "docs" 11 | DOWNLOAD_PAGE = "download" 12 | DEV_GUIDE = "devguide" 13 | 14 | 15 | class PublisherChoices(Enum): 16 | FOUNDATION = "psf" 17 | PYCON = "pycon" 18 | PYPI = "pypi" 19 | CORE_DEV = "core" 20 | 21 | 22 | class AssetsRelatedTo(Enum): 23 | SPONSOR = "sponsor" 24 | SPONSORSHIP = "sponsorship" 25 | -------------------------------------------------------------------------------- /community/migrations/0003_auto_20170831_0358.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 1.9.13 on 2017-08-31 03:58 2 | 3 | import django.contrib.postgres.fields.jsonb 4 | from django.db import migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('community', '0002_auto_20150416_1853'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='post', 16 | name='meta', 17 | field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default={}), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /sponsors/migrations/0045_add_added_by_user_sponsorbenefit.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-08-19 13:16 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0044_auto_20210827_1344'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='sponsorbenefit', 15 | name='added_by_user', 16 | field=models.BooleanField(blank=True, default=False, verbose_name='Added by user?'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /sponsors/migrations/0064_sponsorshippackage_slug.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-12-23 13:08 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0063_auto_20211220_1422'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='sponsorshippackage', 15 | name='slug', 16 | field=models.SlugField(default='', help_text='Internal identifier used to reference this package.'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /sponsors/migrations/0067_sponsorbenefit_a_la_carte.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-12-24 14:21 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0066_auto_20211223_1318'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='sponsorbenefit', 15 | name='a_la_carte', 16 | field=models.BooleanField(blank=True, default=False, verbose_name='Added as a la carte benefit?'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /community/migrations/0004_auto_20170831_0541.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 1.9.13 on 2017-08-31 05:41 2 | 3 | import django.contrib.postgres.fields.jsonb 4 | from django.db import migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('community', '0003_auto_20170831_0358'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='post', 16 | name='meta', 17 | field=django.contrib.postgres.fields.jsonb.JSONField(blank=True, default=dict), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /fastly/utils.py: -------------------------------------------------------------------------------- 1 | import requests 2 | 3 | from django.conf import settings 4 | 5 | 6 | def purge_url(path): 7 | """ 8 | Purge a Fastly.com URL given a path. path argument must begin with a slash 9 | """ 10 | if settings.DEBUG: 11 | return 12 | 13 | api_key = getattr(settings, 'FASTLY_API_KEY', None) 14 | if api_key: 15 | response = requests.request( 16 | 'PURGE', 17 | f'https://www.python.org{path}', 18 | headers={'Fastly-Key': api_key}, 19 | ) 20 | return response 21 | 22 | return None 23 | -------------------------------------------------------------------------------- /static/img/sponsors/title-6.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | chunky_png (1.4.0) 5 | compass (0.12.7) 6 | chunky_png (~> 1.2) 7 | fssm (>= 0.2.7) 8 | sass (~> 3.2.19) 9 | foreman (0.61.0) 10 | thor (>= 0.13.6) 11 | fssm (0.2.10) 12 | sass (3.2.19) 13 | susy (1.0.9) 14 | compass (>= 0.12.2) 15 | sass (>= 3.2.0) 16 | thor (0.17.0) 17 | 18 | PLATFORMS 19 | ruby 20 | 21 | DEPENDENCIES 22 | compass (~> 0.12.7) 23 | foreman (~> 0.61.0) 24 | sass (~> 3.2.19) 25 | susy (~> 1.0.9) 26 | 27 | BUNDLED WITH 28 | 2.1.4 29 | -------------------------------------------------------------------------------- /downloads/migrations/0008_auto_20220907_2102.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2022-09-07 21:02 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('downloads', '0007_auto_20220809_1655'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddConstraint( 14 | model_name='releasefile', 15 | constraint=models.UniqueConstraint(condition=models.Q(download_button=True), fields=('os', 'release'), name='only_one_download_per_os_per_release'), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /templates/users/membership_thanks.html: -------------------------------------------------------------------------------- 1 | {% extends "users/base.html" %} 2 | 3 | {% block page_title %}Thanks | Our Users & Members | {{ SITE_INFO.site_name }}{% endblock %} 4 | 5 | {% block body_attributes %}class="psf signup default-page"{% endblock %} 6 | 7 | 8 | {% block main-nav_attributes %}psf-navigation{% endblock %} 9 | 10 | 11 | {% block user_content %} 12 | 13 |
    14 |

    Your membership information has been saved successfully.

    15 |
    16 | 17 | {% endblock user_content %} 18 | -------------------------------------------------------------------------------- /users/migrations/0009_auto_20170821_2000.py: -------------------------------------------------------------------------------- 1 | from django.db import migrations, models 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('users', '0008_auto_20170814_0301'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='user', 13 | name='bio_markup_type', 14 | field=models.CharField(choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text')], default='markdown', max_length=30), 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /downloads/migrations/0009_releasefile_sigstore_bundle_file.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2023-02-14 21:14 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('downloads', '0008_auto_20220907_2102'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='releasefile', 15 | name='sigstore_bundle_file', 16 | field=models.URLField(blank=True, help_text='Sigstore Bundle URL', verbose_name='Sigstore Bundle URL'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /downloads/migrations/0010_releasefile_sbom_spdx2_file.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2024-01-12 21:04 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('downloads', '0009_releasefile_sigstore_bundle_file'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='releasefile', 15 | name='sbom_spdx2_file', 16 | field=models.URLField(blank=True, help_text='SPDX-2 SBOM URL', verbose_name='SPDX-2 SBOM URL'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /static/img/sponsors/title-3.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /templates/registration/logged_out.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | 4 | {% block main_navigation %} 5 | {% load sitetree %} 6 | {% sitetree_menu from "main" include "psf-meta" template "sitetree/submenu.html" %} 7 | {% endblock %} 8 | 9 | 10 | {% block body_attributes %}class="python default-page logout"{% endblock %} 11 | 12 | 13 | {% block content_attributes %}with-right-sidebar{% endblock %} 14 | 15 | 16 | {% block content %} 17 |
    18 | 19 |

    You have been logged out.

    20 | 21 |
    22 | {% endblock content %} 23 | -------------------------------------------------------------------------------- /sponsors/migrations/0101_sponsor_linked_in_page_url.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2024-02-09 13:30 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0100_auto_20240107_1054'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='sponsor', 15 | name='linked_in_page_url', 16 | field=models.URLField(blank=True, help_text='URL for your LinkedIn page.', null=True, verbose_name='LinkedIn page URL'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /sponsors/utils.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | from django.core.files.storage import default_storage 4 | 5 | 6 | def file_from_storage(filename, mode): 7 | try: 8 | # if using S3 Storage the file will always exist 9 | file = default_storage.open(filename, mode) 10 | except FileNotFoundError as e: 11 | # local env, not using S3 12 | path = Path(e.filename).parent 13 | if not path.exists(): 14 | path.mkdir(parents=True) 15 | Path(e.filename).touch() 16 | file = default_storage.open(filename, mode) 17 | 18 | return file 19 | -------------------------------------------------------------------------------- /templates/jobs/header_content.html: -------------------------------------------------------------------------------- 1 |
    2 |

    Get exploring!

    3 |

    {{ jobs_count }} jobs from {{ companies_count }} companies on the Python Job Board

    4 | 7 |
    8 | -------------------------------------------------------------------------------- /jobs/migrations/0004_auto_20150216_1544.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('jobs', '0003_auto_20150211_1738'), 8 | ] 9 | 10 | operations = [ 11 | migrations.RemoveField( 12 | model_name='job', 13 | name='company', 14 | ), 15 | migrations.AlterField( 16 | model_name='job', 17 | name='company_name', 18 | field=models.CharField(null=True, max_length=100), 19 | preserve_default=True, 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /sponsors/migrations/0032_sponsorcontact_accounting.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2021-08-10 12:37 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0031_auto_20210810_1232'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='sponsorcontact', 15 | name='accounting', 16 | field=models.BooleanField(default=False, help_text='Accounting contacts will only be notified regarding invoices and payments.'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /sponsors/migrations/0039_auto_20210827_1248.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2021-08-27 12:48 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0038_auto_20210827_1223'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='sponsorship', 15 | name='level_name', 16 | field=models.CharField(blank=True, default='', help_text='DEPRECATED: will be removed after manual data sanity check.', max_length=64), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /companies/migrations/0004_auto_20170821_2000.py: -------------------------------------------------------------------------------- 1 | from django.db import migrations, models 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('companies', '0003_auto_20170814_0301'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='company', 13 | name='about_markup_type', 14 | field=models.CharField(choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text')], default='restructuredtext', max_length=30), 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /jobs/migrations/0016_auto_20170821_2000.py: -------------------------------------------------------------------------------- 1 | from django.db import migrations, models 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('jobs', '0015_auto_20170814_0301'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='job', 13 | name='company_description_markup_type', 14 | field=models.CharField(choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text')], default='restructuredtext', max_length=30), 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /sponsors/migrations/0034_contract_document_docx.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2021-08-20 16:41 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0033_tieredquantity_tieredquantityconfiguration'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='contract', 15 | name='document_docx', 16 | field=models.FileField(blank=True, upload_to='sponsors/statmentes_of_work/docx/', verbose_name='Unsigned Docx'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /users/migrations/0006_auto_20150503_2124.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | from django.conf import settings 3 | 4 | 5 | class Migration(migrations.Migration): 6 | 7 | dependencies = [ 8 | ('users', '0005_user_public_profile'), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name='membership', 14 | name='creator', 15 | field=models.OneToOneField(null=True, blank=True, to=settings.AUTH_USER_MODEL, related_name='membership', on_delete=models.CASCADE), 16 | preserve_default=True, 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /env_sample: -------------------------------------------------------------------------------- 1 | # development 2 | DATABASE_URL=postgres:///pythondotorg 3 | SEARCHBOX_SSL_URL=http://127.0.0.1:9200/ 4 | 5 | # production required 6 | SECRET_KEY= 7 | ALLOWED_HOSTS=127.0.0.1, 8 | EMAIL_HOST= 9 | EMAIL_HOST_USER= 10 | EMAIL_HOST_PASSWORD= 11 | EMAIL_PORT= 12 | DEFAULT_FROM_EMAIL= 13 | FASTLY_API_KEY= 14 | SENTRY_DSN= 15 | SOURCE_VERSION= 16 | AWS_ACCESS_KEY_ID= 17 | AWS_SECRET_ACCESS_KEY= 18 | AWS_STORAGE_BUCKET_NAME= 19 | 20 | 21 | # production optional 22 | #SPONSORSHIP_NOTIFICATION_FROM_EMAIL= 23 | #SPONSORSHIP_NOTIFICATION_TO_EMAIL= 24 | #AWS_DEFAULT_ACL= 25 | #AWS_S3_REGION_NAME= 26 | #AWS_S3_ENDPOINT_URL= -------------------------------------------------------------------------------- /sponsors/migrations/0048_auto_20210915_1425.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-09-15 14:25 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0047_auto_20210908_1357'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='sponsorshippackage', 15 | name='advertise', 16 | field=models.BooleanField(blank=True, default=False, help_text='If checked, this package will be advertised in the sponsosrhip application'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /sponsors/migrations/0037_sponsorship_package.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2021-08-27 12:23 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('sponsors', '0036_auto_20210826_1930'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='sponsorship', 16 | name='package', 17 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='sponsors.SponsorshipPackage'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /sponsors/migrations/0042_auto_20210827_1318.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2021-08-27 13:18 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0041_auto_20210827_1313'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='sponsorshippackage', 15 | name='logo_dimension', 16 | field=models.PositiveIntegerField(blank=True, default=175, help_text='Internal value used to control logos dimensions at sponsors page'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /sponsors/migrations/0091_sponsorshippackage_allow_a_la_carte.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2022-08-13 10:51 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0090_auto_20220812_1314'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='sponsorshippackage', 15 | name='allow_a_la_carte', 16 | field=models.BooleanField(default=True, help_text='If disabled, a la carte benefits will be disabled in application form'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /templates/jobs/email/job_was_rejected.txt: -------------------------------------------------------------------------------- 1 | Dear {{ user_name }}, 2 | 3 | Thank you for choosing to list your vacancy on the PSF Python Job Board. 4 | 5 | Unfortunately, your listing does not comply to our Job Board listing 6 | guidelines (see https://www.python.org/community/jobs/howto/). If possible, 7 | please update your listing and resubmit the request. 8 | 9 | You can view and edit your listing at https://{{ site.domain }}{{ content_object.get_absolute_url }}. 10 | 11 | If you have questions, please contact the Job Board Team at jobs@python.org. 12 | 13 | Many thanks, 14 | {{ reviewer_name }} 15 | Python Job Board 16 | -------------------------------------------------------------------------------- /work_groups/migrations/0003_auto_20170821_2000.py: -------------------------------------------------------------------------------- 1 | from django.db import migrations, models 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('work_groups', '0002_auto_20150604_2203'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='workgroup', 13 | name='support_markup_type', 14 | field=models.CharField(choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text')], default='restructuredtext', max_length=30), 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 5 | #### Description 6 | 7 | - 8 | 9 | 16 | #### Closes 17 | 18 | - 19 | 20 | -------------------------------------------------------------------------------- /community/migrations/0002_auto_20150416_1853.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('community', '0001_initial'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='post', 13 | name='content_markup_type', 14 | field=models.CharField(max_length=30, default='html', choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text')]), 15 | preserve_default=True, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /pages/tests/base.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth import get_user_model 2 | from django.test import TestCase 3 | from ..models import Page 4 | 5 | User = get_user_model() 6 | 7 | 8 | class BasePageTests(TestCase): 9 | def setUp(self): 10 | self.p1 = Page.objects.create(title='One', path='one', content='Whatever', is_published=True) 11 | self.p2 = Page.objects.create(title='Two', path='two', content='Yup', is_published=False) 12 | 13 | self.staff_user = User.objects.create_user(username='staff_user', password='staff_user') 14 | self.staff_user.is_staff = True 15 | self.staff_user.save() 16 | -------------------------------------------------------------------------------- /sponsors/migrations/0046_sponsorshippackage_advertise.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2021-09-08 13:52 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0045_add_added_by_user_sponsorbenefit'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='sponsorshippackage', 15 | name='advertise', 16 | field=models.BooleanField(default=False, help_text='If checked, this package will be advertised in the sponsosrhip application'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /templates/account/logout.html: -------------------------------------------------------------------------------- 1 | {% extends "account/base.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block head_title %}{% trans "Sign Out" %}{% endblock %} 6 | 7 | {% block content %} 8 |

    {% trans "Sign Out" %}

    9 | 10 |

    {% trans 'Are you sure you want to sign out?' %}

    11 | 12 |
    13 | {% csrf_token %} 14 | {% if redirect_field_value %} 15 | 16 | {% endif %} 17 | 18 |
    19 | 20 | 21 | {% endblock %} 22 | -------------------------------------------------------------------------------- /boxes/migrations/0002_auto_20150416_1853.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('boxes', '0001_initial'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='box', 13 | name='content_markup_type', 14 | field=models.CharField(max_length=30, default='restructuredtext', choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text')]), 15 | preserve_default=True, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /pages/migrations/0002_auto_20150416_1853.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('pages', '0001_initial'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='page', 13 | name='content_markup_type', 14 | field=models.CharField(max_length=30, default='restructuredtext', choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text')]), 15 | preserve_default=True, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /users/migrations/0002_auto_20150416_1853.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('users', '0001_initial'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='user', 13 | name='bio_markup_type', 14 | field=models.CharField(max_length=30, choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text')], default='markdown', blank=True), 15 | preserve_default=True, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /minutes/migrations/0002_auto_20150416_1853.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('minutes', '0001_initial'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='minutes', 13 | name='content_markup_type', 14 | field=models.CharField(max_length=30, default='restructuredtext', choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text')]), 15 | preserve_default=True, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /sponsors/migrations/0044_auto_20210827_1344.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2021-08-27 13:44 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0043_auto_20210827_1343'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='sponsorship', 15 | name='level_name_old', 16 | field=models.CharField(blank=True, default='', help_text='DEPRECATED: shall be removed after manual data sanity check.', max_length=64, verbose_name='Level name'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /downloads/migrations/0002_auto_20150416_1853.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('downloads', '0001_initial'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='release', 13 | name='content_markup_type', 14 | field=models.CharField(max_length=30, default='restructuredtext', choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text')]), 15 | preserve_default=True, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /mailing/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from django.template import Template, Context, TemplateSyntaxError 3 | 4 | from mailing.models import BaseEmailTemplate 5 | 6 | 7 | class BaseEmailTemplateForm(forms.ModelForm): 8 | 9 | def clean_content(self): 10 | content = self.cleaned_data["content"] 11 | try: 12 | template = Template(content) 13 | template.render(Context({})) 14 | return content 15 | except TemplateSyntaxError as e: 16 | raise forms.ValidationError(e) 17 | 18 | class Meta: 19 | model = BaseEmailTemplate 20 | fields = "__all__" 21 | -------------------------------------------------------------------------------- /membership/tests/test_views.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | from waffle.testutils import override_flag 4 | 5 | 6 | class MembershipViewTests(TestCase): 7 | 8 | @override_flag('psf_membership', active=False) 9 | def test_membership_landing_ensure_404(self): 10 | response = self.client.get('/membership/') 11 | self.assertEqual(response.status_code, 404) 12 | 13 | @override_flag('psf_membership', active=True) 14 | def test_membership_landing(self): 15 | # Ensure FlagMixin is working 16 | response = self.client.get('/membership/') 17 | self.assertEqual(response.status_code, 200) 18 | -------------------------------------------------------------------------------- /sponsors/migrations/0078_init_current_year_singleton.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2022-07-28 16:04 2 | 3 | from django.db import migrations 4 | 5 | 6 | def populate_singleton(apps, schema_editor): 7 | SponsorshipCurrentYear = apps.get_model("sponsors.SponsorshipCurrentYear") 8 | SponsorshipCurrentYear.objects.get_or_create(id=1, defaults={"year": 2022}) 9 | 10 | 11 | class Migration(migrations.Migration): 12 | 13 | dependencies = [ 14 | ('sponsors', '0077_sponsorshipcurrentyear'), 15 | ] 16 | 17 | operations = [ 18 | migrations.RunPython(populate_singleton, migrations.RunPython.noop) 19 | ] 20 | -------------------------------------------------------------------------------- /static/img/sponsors/tick.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /downloads/migrations/0012_alter_release_version.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.20 on 2025-04-24 19:26 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('downloads', '0011_alter_os_creator_alter_os_last_modified_by_and_more'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='release', 15 | name='version', 16 | field=models.IntegerField(choices=[(3, 'Python 3.x.x'), (2, 'Python 2.x.x'), (1, 'Python 1.x.x'), (100, 'Python install manager')], default=3), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /sponsors/exceptions.py: -------------------------------------------------------------------------------- 1 | class SponsorWithExistingApplicationException(Exception): 2 | """ 3 | Raised when user tries to create a new Sponsorship application 4 | for a Sponsor which already has applications pending to review 5 | """ 6 | 7 | 8 | class InvalidStatusException(Exception): 9 | """ 10 | Raised when user tries to change the Sponsorship's status 11 | to a new one but from an invalid current status 12 | """ 13 | 14 | 15 | class SponsorshipInvalidDateRangeException(Exception): 16 | """ 17 | Raised when user tries to approve a sponsorship with a start date 18 | greater than the end date. 19 | """ 20 | -------------------------------------------------------------------------------- /templates/robots.txt: -------------------------------------------------------------------------------- 1 | # Directions for robots. See this URL: 2 | # http://www.robotstxt.org/robotstxt.html 3 | # for a description of the file format. 4 | 5 | User-agent: HTTrack 6 | User-agent: puf 7 | User-agent: MSIECrawler 8 | Disallow: / 9 | 10 | # The Krugle web crawler (though based on Nutch) is OK. 11 | User-agent: Krugle 12 | Allow: / 13 | Disallow: /~guido/orlijn/ 14 | Disallow: /webstats/ 15 | 16 | # No one should be crawling us with Nutch. 17 | User-agent: Nutch 18 | Disallow: / 19 | 20 | # Hide old versions of the documentation and various large sets of files. 21 | User-agent: * 22 | Disallow: /~guido/orlijn/ 23 | Disallow: /webstats/ 24 | -------------------------------------------------------------------------------- /companies/migrations/0002_auto_20150416_1853.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('companies', '0001_initial'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='company', 13 | name='about_markup_type', 14 | field=models.CharField(max_length=30, choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text')], default='restructuredtext', blank=True), 15 | preserve_default=True, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /events/migrations/0003_auto_20150416_1853.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('events', '0002_auto_20150321_1247'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='event', 13 | name='description_markup_type', 14 | field=models.CharField(max_length=30, default='restructuredtext', choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text')]), 15 | preserve_default=True, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /successstories/migrations/0002_auto_20150416_1853.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('successstories', '0001_initial'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AlterField( 12 | model_name='story', 13 | name='content_markup_type', 14 | field=models.CharField(max_length=30, default='restructuredtext', choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text')]), 15 | preserve_default=True, 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: CPython Documentation 4 | url: https://docs.python.org/ 5 | about: Official CPython documentation - please check here before opening an issue. 6 | - name: Python Website 7 | url: https://python.org/ 8 | about: For all things Python 9 | - name: PyPI Issues / Support 10 | url: https://github.com/pypi/support 11 | about: For issues with PyPI itself, PyPI accounts, or with packages hosted on PyPI. 12 | - name: CPython Issues 13 | url: https://github.com/python/cpython/issues 14 | about: For issues with the CPython interpreter itself. 15 | -------------------------------------------------------------------------------- /sponsors/migrations/0022_sponsorcontact_administrative.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2020-12-21 11:46 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ("sponsors", "0021_auto_20201211_2120"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name="sponsorcontact", 15 | name="administrative", 16 | field=models.BooleanField( 17 | default=False, 18 | help_text="If this is an administrative contact for the sponsor", 19 | ), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /sponsors/migrations/0075_auto_20220303_2023.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2022-03-03 20:23 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | import django.db.models.manager 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('sponsors', '0074_auto_20220211_1659'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='sponsorship', 17 | name='overlapped_by', 18 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='sponsors.Sponsorship'), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /sponsors/migrations/0098_auto_20231219_1910.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2023-12-19 19:10 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0097_sponsorship_renewal'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='sponsorship', 15 | name='renewal', 16 | field=models.BooleanField(blank=True, help_text='If true, it means the sponsorship is a renewal of a previous sponsorship and will use the renewal template for contracting.', null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /events/management/commands/import_ics_calendars.py: -------------------------------------------------------------------------------- 1 | from django.core.management import BaseCommand 2 | from events.models import Calendar 3 | 4 | 5 | class Command(BaseCommand): 6 | """ 7 | Imports ICS calendars. 8 | When used in cron jobs, it is advised to add file-locking by using the flock(1) 9 | command. Eg:: 10 | 11 | flock -n import_ics_calendars.lock -c django-admin.py import_ics_calendars --settings=pydotorg.settings.local 12 | 13 | """ 14 | 15 | def handle(self, **options): 16 | calendars = Calendar.objects.filter(url__isnull=False) 17 | for calendar in calendars: 18 | calendar.import_events() 19 | -------------------------------------------------------------------------------- /sponsors/migrations/0068_auto_20220110_1841.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2022-01-10 18:41 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0067_sponsorbenefit_a_la_carte'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='sponsorship', 15 | name='for_modified_package', 16 | field=models.BooleanField(default=False, help_text="If true, it means the user customized the package's benefits. Changes are listed under section 'User Customizations'."), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /sponsors/migrations/0092_auto_20220816_1517.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2022-08-16 15:17 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0091_sponsorshippackage_allow_a_la_carte'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='sponsorshipbenefit', 15 | name='unavailable', 16 | field=models.BooleanField(default=False, help_text='If selected, this benefit will not be visible or available to applicants.', verbose_name='Benefit is unavailable'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /templates/community/post_detail.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block page_title %}{{ object.title }} | {{ SITE_INFO.site_name }}{% endblock %} 4 | {% block og_title %}{{ object.title }}{% endblock %} 5 | 6 | {% block body_attributes %}class="shop community default-page"{% endblock %} 7 | 8 | 9 | {% block main-nav_attributes %}community-navigation{% endblock main-nav_attributes %} 10 | 11 | 12 | {% block content_attributes %}with-right-sidebar{% endblock content_attributes %} 13 | 14 | 15 | {% block content %} 16 | {% if object.title %} 17 |

    {{ object.title }}

    18 | {% endif %} 19 | 20 | {{ object.content }} 21 | {% endblock content %} 22 | -------------------------------------------------------------------------------- /templates/events/event_form_thanks.html: -------------------------------------------------------------------------------- 1 | {% extends "events/base.html" %} 2 | 3 | {% block page_title %}Event Submitted | {{ SITE_INFO.site_name }}{% endblock %} 4 | 5 | {% block content %} 6 |
    7 |

    Thank you for filing a new event!

    8 |
    9 |

    10 | Your event has been submitted! This has sent 11 | an email to the maintainers of the Python Events calendar. 12 | Please check your email and await for updates. Thanks a lot! 13 |

    14 |
    15 |
    16 | {% endblock content %} 17 | -------------------------------------------------------------------------------- /templates/successstories/supernav.html: -------------------------------------------------------------------------------- 1 | 2 |
  • 3 | {% if story.image %} 4 | {{ story.get_company_name }} 5 | {% endif %} 6 |
    7 | {{ story.pull_quote }} 8 |
    9 |

    {{ story.author }}, {% if story.get_company_url %}{{ story.get_company_name }}{% else %}{{ story.get_company_name }}{% endif %}

    10 | 11 |
  • -------------------------------------------------------------------------------- /jobs/management/commands/expire_jobs.py: -------------------------------------------------------------------------------- 1 | import datetime 2 | 3 | from django.core.management import BaseCommand 4 | from django.conf import settings 5 | from django.utils import timezone 6 | 7 | from jobs.models import Job 8 | 9 | 10 | class Command(BaseCommand): 11 | """ Expire jobs older than settings.JOB_THRESHOLD_DAYS """ 12 | 13 | def handle(self, **options): 14 | days = getattr(settings, 'JOB_THRESHOLD_DAYS', 90) 15 | expiration = timezone.now() - datetime.timedelta(days=days) 16 | 17 | Job.objects.approved().filter( 18 | expires__lte=expiration 19 | ).update( 20 | status=Job.STATUS_EXPIRED 21 | ) 22 | -------------------------------------------------------------------------------- /sponsors/migrations/0019_sponsor_twitter_handle.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2021-02-12 14:46 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ("sponsors", "0018_auto_20201201_1659"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name="sponsor", 15 | name="twitter_handle", 16 | field=models.CharField( 17 | blank=True, 18 | max_length=32, 19 | null=True, 20 | verbose_name="Sponsor twitter hanlde", 21 | ), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /sponsors/migrations/0089_auto_20220812_1312.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2022-08-12 13:12 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0088_auto_20220810_1655'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RenameField( 14 | model_name='sponsorbenefit', 15 | old_name='a_la_carte', 16 | new_name='standalone', 17 | ), 18 | migrations.RenameField( 19 | model_name='sponsorshipbenefit', 20 | old_name='a_la_carte', 21 | new_name='standalone', 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /sponsors/migrations/0093_auto_20230214_2113.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2023-02-14 21:13 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0092_auto_20220816_1517'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='sponsorshipbenefit', 15 | name='package_only', 16 | field=models.BooleanField(default=False, help_text='If a benefit is only available via a sponsorship package and not as an add-on, select this option.', verbose_name='Sponsor Package Only Benefit'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /successstories/migrations/0011_auto_20220127_1923.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2022-01-27 19:23 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('successstories', '0010_story_submitted_by'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='story', 17 | name='submitted_by', 18 | field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /downloads/migrations/0013_alter_release_content_markup_type.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 4.2.25 on 2025-11-01 21:19 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('downloads', '0012_alter_release_version'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='release', 15 | name='content_markup_type', 16 | field=models.CharField(choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text')], default='markdown', max_length=30), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /templates/jobs/featured_companies-widget.html: -------------------------------------------------------------------------------- 1 | {% load imagekit %} 2 | {% load boxes %} 3 | 4 | {% if featured_companies %} 5 | 17 | {% endif %} 18 | -------------------------------------------------------------------------------- /companies/templatetags/companies.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from django.template.defaultfilters import stringfilter 3 | from django.utils.html import format_html 4 | 5 | 6 | register = template.Library() 7 | 8 | 9 | @register.filter(is_safe=True) 10 | @stringfilter 11 | def render_email(value): 12 | if value: 13 | mailbox, domain = value.split('@') 14 | mailbox_tokens = mailbox.split('.') 15 | domain_tokens = domain.split('.') 16 | 17 | mailbox = '.'.join(mailbox_tokens) 18 | domain = '.'.join(domain_tokens) 19 | 20 | return format_html('@'.join((mailbox, domain))) 21 | return None 22 | -------------------------------------------------------------------------------- /sponsors/migrations/0027_sponsorbenefit_program_name.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2021-06-29 19:36 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('sponsors', '0026_auto_20210416_1940'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='sponsorbenefit', 15 | name='program_name', 16 | field=models.CharField(default='Deleted Program', help_text='For display in the contract and sponsor dashboard.', max_length=1024, verbose_name='Program Name'), 17 | preserve_default=False, 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /users/migrations/0007_auto_20150604_1555.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | def create_psf_membership_flag(apps, schema_editor): 5 | Flag = apps.get_model('waffle', 'Flag') 6 | Flag.objects.create( 7 | name='psf_membership', 8 | testing=True, 9 | note='This flag is used to show the PSF Basic and Advanced member registration process.' 10 | ) 11 | 12 | 13 | class Migration(migrations.Migration): 14 | 15 | dependencies = [ 16 | ('users', '0006_auto_20150503_2124'), 17 | ('waffle', '0001_initial'), 18 | ] 19 | 20 | operations = [ 21 | migrations.RunPython(create_psf_membership_flag), 22 | ] 23 | -------------------------------------------------------------------------------- /templates/sitetree/top.html: -------------------------------------------------------------------------------- 1 | {% load sitetree %} 2 | 3 | 10 | -------------------------------------------------------------------------------- /banners/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | 4 | class Banner(models.Model): 5 | 6 | title = models.CharField( 7 | max_length=1024, help_text="Text to display in the banner's button" 8 | ) 9 | message = models.CharField( 10 | max_length=2048, help_text="Message to display in the banner" 11 | ) 12 | link = models.CharField(max_length=1024, help_text="Link the button will go to") 13 | active = models.BooleanField( 14 | null=False, default=False, help_text="Make the banner active on the site" 15 | ) 16 | psf_pages_only = models.BooleanField( 17 | null=False, default=True, help_text="Display the banner on /psf pages only" 18 | ) 19 | -------------------------------------------------------------------------------- /events/migrations/0002_auto_20150321_1247.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('events', '0001_initial'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AddField( 12 | model_name='occurringrule', 13 | name='all_day', 14 | field=models.BooleanField(default=False), 15 | preserve_default=True, 16 | ), 17 | migrations.AddField( 18 | model_name='recurringrule', 19 | name='all_day', 20 | field=models.BooleanField(default=False), 21 | preserve_default=True, 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /jobs/migrations/0018_auto_20180705_0352.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.6 on 2018-07-05 03:52 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('jobs', '0017_auto_20180705_0348'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='jobcategory', 15 | name='slug', 16 | field=models.SlugField(max_length=200, unique=True), 17 | ), 18 | migrations.AlterField( 19 | model_name='jobtype', 20 | name='slug', 21 | field=models.SlugField(max_length=200, unique=True), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /successstories/templatetags/successstories.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | 3 | from ..models import Story, StoryCategory 4 | 5 | 6 | register = template.Library() 7 | 8 | 9 | @register.simple_tag 10 | def get_story_categories(): 11 | return StoryCategory.objects.all() 12 | 13 | 14 | @register.simple_tag 15 | def get_featured_story(): 16 | return Story.objects.random_featured() 17 | 18 | 19 | @register.simple_tag 20 | def get_stories_by_category(category_slug, limit=5): 21 | return Story.objects.published().filter(category__slug__exact=category_slug)[:limit] 22 | 23 | 24 | @register.simple_tag 25 | def get_stories_latest(limit=5): 26 | return Story.objects.published()[:limit] 27 | -------------------------------------------------------------------------------- /jobs/migrations/0003_auto_20150211_1738.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | def remove_job_submit_sidebar_box(apps, schema_editor): 5 | """ 6 | Remove jobs-submitajob box 7 | """ 8 | Box = apps.get_model('boxes', 'Box') 9 | try: 10 | submit_box = Box.objects.get(label='jobs-submitajob') 11 | submit_box.delete() 12 | except Box.DoesNotExist: 13 | pass 14 | 15 | 16 | class Migration(migrations.Migration): 17 | 18 | dependencies = [ 19 | ('jobs', '0002_auto_20150211_1634'), 20 | ('boxes', '0001_initial'), 21 | ] 22 | 23 | operations = [ 24 | migrations.RunPython(remove_job_submit_sidebar_box), 25 | ] 26 | -------------------------------------------------------------------------------- /pages/migrations/0003_auto_20230214_2113.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2023-02-14 21:13 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('pages', '0002_auto_20150416_1853'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='page', 15 | name='content_markup_type', 16 | field=models.CharField(choices=[('', '--'), ('html', 'HTML'), ('plain', 'Plain'), ('markdown', 'Markdown'), ('restructuredtext', 'Restructured Text'), ('markdown_unsafe', 'Markdown (unsafe)')], default='restructuredtext', max_length=30), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /sponsors/migrations/0047_auto_20210908_1357.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2021-09-08 13:57 2 | 3 | from django.db import migrations 4 | 5 | 6 | def update_package_as_advertisable(apps, schema_editor): 7 | SponsorshipPackage = apps.get_model("sponsors.SponsorshipPackage") 8 | # initial sponsorship packages should remaing visible in the form 9 | SponsorshipPackage.objects.all().update(advertise=True) 10 | 11 | 12 | class Migration(migrations.Migration): 13 | 14 | dependencies = [ 15 | ('sponsors', '0046_sponsorshippackage_advertise'), 16 | ] 17 | 18 | operations = [ 19 | migrations.RunPython(update_package_as_advertisable, migrations.RunPython.noop) 20 | ] 21 | -------------------------------------------------------------------------------- /templates/sitetree/breadcrumbs.html: -------------------------------------------------------------------------------- 1 | {% load sitetree %} 2 | {% if sitetree_items|length_is:"1" %} 3 | {% else %} 4 | 21 | {% endif %} -------------------------------------------------------------------------------- /cms/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | 3 | 4 | class ContentManageableModelForm(forms.ModelForm): 5 | class Meta: 6 | fields = [] 7 | 8 | def __init__(self, request=None, *args, **kwargs): 9 | self.request = request 10 | super().__init__(*args, **kwargs) 11 | 12 | def save(self, commit=True): 13 | obj = super().save(commit=False) 14 | 15 | if self.request is not None and self.request.user.is_authenticated: 16 | if not obj.pk: 17 | obj.creator = self.request.user 18 | else: 19 | obj.last_modified_by = self.request.user 20 | 21 | if commit: 22 | obj.save() 23 | return obj 24 | -------------------------------------------------------------------------------- /events/migrations/0004_auto_20170814_0519.py: -------------------------------------------------------------------------------- 1 | from django.db import migrations, models 2 | import events.models 3 | 4 | 5 | class Migration(migrations.Migration): 6 | 7 | dependencies = [ 8 | ('events', '0003_auto_20150416_1853'), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name='recurringrule', 14 | name='duration_internal', 15 | field=models.DurationField(default=events.models.duration_default), 16 | ), 17 | migrations.AlterField( 18 | model_name='recurringrule', 19 | name='duration', 20 | field=models.CharField(default='15 min', max_length=50), 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /jobs/migrations/0019_job_submitted_by.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2019-09-06 20:29 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('jobs', '0018_auto_20180705_0352'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name='job', 18 | name='submitted_by', 19 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /successstories/migrations/0009_auto_20180705_0352.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.6 on 2018-07-05 03:52 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('successstories', '0008_auto_20170821_2000'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='story', 15 | name='slug', 16 | field=models.SlugField(max_length=200, unique=True), 17 | ), 18 | migrations.AlterField( 19 | model_name='storycategory', 20 | name='slug', 21 | field=models.SlugField(max_length=200, unique=True), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /community/tests/test_views.py: -------------------------------------------------------------------------------- 1 | from pydotorg.tests.test_classes import TemplateTestCase 2 | from ..models import Post 3 | 4 | 5 | class CommunityTagsTest(TemplateTestCase): 6 | def test_render_template_for(self): 7 | obj = Post.objects.create( 8 | content='text post', 9 | media_type=Post.MEDIA_TEXT, 10 | status=Post.STATUS_PRIVATE 11 | ) 12 | template = '{% load community %}{% render_template_for post as html %}{{ html }}' 13 | rendered = self.render_string(template, {'post': obj}) 14 | expected = '

    todo: types/text.html - Post text ({0:d})

    \n' 15 | self.assertEqual(rendered, expected.format(obj.pk)) 16 | -------------------------------------------------------------------------------- /users/migrations/0003_auto_20150503_2026.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('users', '0002_auto_20150416_1853'), 8 | ] 9 | 10 | operations = [ 11 | migrations.AddField( 12 | model_name='membership', 13 | name='last_vote_affirmation', 14 | field=models.DateTimeField(blank=True, null=True), 15 | preserve_default=True, 16 | ), 17 | migrations.AddField( 18 | model_name='membership', 19 | name='votes', 20 | field=models.BooleanField(default=False), 21 | preserve_default=True, 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /pages/factories.py: -------------------------------------------------------------------------------- 1 | import factory 2 | 3 | from django.template.defaultfilters import slugify 4 | from factory.django import DjangoModelFactory 5 | 6 | from users.factories import UserFactory 7 | 8 | from .models import Page 9 | 10 | 11 | class PageFactory(DjangoModelFactory): 12 | 13 | class Meta: 14 | model = Page 15 | django_get_or_create = ('path',) 16 | 17 | title = factory.Faker('sentence', nb_words=5) 18 | path = factory.LazyAttribute(lambda o: slugify(o.title)) 19 | content = factory.Faker('paragraph', nb_sentences=5) 20 | creator = factory.SubFactory(UserFactory) 21 | 22 | 23 | def initial_data(): 24 | return { 25 | 'pages': PageFactory.create_batch(size=50), 26 | } 27 | -------------------------------------------------------------------------------- /sponsors/migrations/0020_sponsorshipbenefit_unavailable.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2021-02-26 15:31 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ("sponsors", "0019_sponsor_twitter_handle"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name="sponsorshipbenefit", 15 | name="unavailable", 16 | field=models.BooleanField( 17 | default=False, 18 | help_text="If selected, this benefit will not be available to applicants.", 19 | verbose_name="Benefit is unavailable", 20 | ), 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /sponsors/migrations/0028_auto_20210707_1426.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.13 on 2021-07-07 14:26 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('sponsors', '0027_sponsorbenefit_program_name'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='sponsorshipbenefit', 16 | name='program', 17 | field=models.ForeignKey(help_text='Which sponsorship program the benefit is associated with.', on_delete=django.db.models.deletion.CASCADE, to='sponsors.SponsorshipProgram', verbose_name='Sponsorship Program'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /templates/components/navigation-widget.html: -------------------------------------------------------------------------------- 1 | {% load sitetree %} 2 | 3 | {% comment %} 4 | Renders sitetrees according to the current URL namespace and name. 5 | 6 | For example, for a URL with namespace = 'events' and name 'event_list', it will 7 | render a tree called 'events' and/or a tree called 'events:event_list', if any 8 | of these exists. 9 | 10 | If the URL is not namespaced, it will only load a tree with the same name of the 11 | URL, ie: 'event_list'. 12 | {% endcomment %} 13 | 14 | 15 | {% if URL_NAMESPACE %} 16 | {% sitetree_tree from URL_NAMESPACE template "sitetree/sidebar_menu_root.html" %} 17 | {% elif URL_NAME %} 18 | {% sitetree_tree from URL_NAME template "sitetree/sidebar_menu_root.html" %} 19 | {% endif %} -------------------------------------------------------------------------------- /users/managers.py: -------------------------------------------------------------------------------- 1 | from django.db.models.query import QuerySet 2 | from django.contrib.auth.models import UserManager as DjangoUserManager 3 | 4 | 5 | class UserQuerySet(QuerySet): 6 | 7 | def active(self): 8 | return self.filter(is_active=True) 9 | 10 | def searchable(self): 11 | return self.active().filter( 12 | public_profile=True, 13 | search_visibility__exact=self.model.SEARCH_PUBLIC, 14 | ) 15 | 16 | 17 | class UserManager(DjangoUserManager.from_queryset(UserQuerySet)): 18 | # 'UserManager.use_in_migrations' is set to True in Django 1.8: 19 | # https://github.com/django/django/blob/1.8.18/django/contrib/auth/models.py#L166 20 | use_in_migrations = False 21 | -------------------------------------------------------------------------------- /successstories/migrations/0010_story_submitted_by.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2022-01-27 19:21 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 12 | ('successstories', '0009_auto_20180705_0352'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name='story', 18 | name='submitted_by', 19 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /templates/sitetree/menu.html: -------------------------------------------------------------------------------- 1 | {% load sitetree %} 2 | 3 | 13 | -------------------------------------------------------------------------------- /blogs/templatetags/blogs.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | 3 | from ..models import BlogEntry 4 | 5 | register = template.Library() 6 | 7 | 8 | @register.simple_tag 9 | def get_latest_blog_entries(limit=5): 10 | """ Return limit of latest blog entries """ 11 | return BlogEntry.objects.order_by("-pub_date")[:limit] 12 | 13 | 14 | @register.simple_tag 15 | def feed_list(slug, limit=10): 16 | """ 17 | Returns a list of blog entries for the given FeedAggregate slug. 18 | 19 | {% feed_list 'psf' as entries %} 20 | {% for entry in entries %} 21 | {{ entry }} 22 | {% endfor %} 23 | """ 24 | return BlogEntry.objects.filter( 25 | feed__feedaggregate__slug=slug).order_by('-pub_date')[:limit] 26 | 27 | -------------------------------------------------------------------------------- /sponsors/migrations/0065_auto_20211223_1309.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-12-23 13:09 2 | 3 | from django.db import migrations 4 | from django.utils.text import slugify 5 | 6 | 7 | def populate_packages_slugs(apps, schema_editor): 8 | SponsorshipPackage = apps.get_model("sponsors", "SponsorshipPackage") 9 | qs = SponsorshipPackage.objects.filter(slug="") 10 | for pkg in qs: 11 | pkg.slug = slugify(pkg.name) 12 | pkg.save() 13 | 14 | 15 | class Migration(migrations.Migration): 16 | 17 | dependencies = [ 18 | ('sponsors', '0064_sponsorshippackage_slug'), 19 | ] 20 | 21 | operations = [ 22 | migrations.RunPython(populate_packages_slugs, migrations.RunPython.noop) 23 | ] 24 | -------------------------------------------------------------------------------- /templates/successstories/storycategory_detail.html: -------------------------------------------------------------------------------- 1 | {% extends "successstories/story_detail.html" %} 2 | 3 | {% block page_title %}{{ object.name }} | Our Success Stories | {{ SITE_INFO.site_name }}{% endblock %} 4 | 5 | {% block body_attributes %}class="python success-stories"{% endblock %} 6 | 7 | {% block content %} 8 | 9 |
    10 | 11 |

    {{ object.name }}

    12 | 13 | 18 | 19 |
    20 | 21 | {% endblock content %} 22 | -------------------------------------------------------------------------------- /blogs/views.py: -------------------------------------------------------------------------------- 1 | from django.views.generic import TemplateView 2 | 3 | from .models import BlogEntry 4 | 5 | 6 | class BlogHome(TemplateView): 7 | """ Main blog view """ 8 | template_name = 'blogs/index.html' 9 | 10 | def get_context_data(self, **kwargs): 11 | context = super().get_context_data(**kwargs) 12 | 13 | entries = BlogEntry.objects.order_by('-pub_date')[:6] 14 | latest_entry = None 15 | other_entries = [] 16 | 17 | if entries: 18 | latest_entry = entries[0] 19 | other_entries = entries[1:] 20 | 21 | context.update({ 22 | 'latest_entry': latest_entry, 23 | 'entries': other_entries, 24 | }) 25 | 26 | return context 27 | -------------------------------------------------------------------------------- /templates/jobs/job_types.html: -------------------------------------------------------------------------------- 1 | {% extends "jobs/base.html" %} 2 | {% load boxes %} 3 | 4 | {% block page_title %}Our Job Types | {{ SITE_INFO.site_name }}{% endblock %} 5 | {% block content_attributes %}with-right-sidebar{% endblock %} 6 | 7 | {% block header_message %}Jobs by Technology!{% endblock %} 8 | {% block header_action %}{{ jobs_count }} Python jobs in {{ types|length }} different types.{% endblock %} 9 | 10 | {% block content %} 11 |
    12 | 13 | 18 | 19 |
    20 | {% endblock content %} 21 | -------------------------------------------------------------------------------- /infra/variables.tf: -------------------------------------------------------------------------------- 1 | variable "FASTLY_API_KEY" { 2 | type = string 3 | description = "API key for the Fastly VCL edge configuration." 4 | sensitive = true 5 | } 6 | variable "FASTLY_HEADER_TOKEN" { 7 | description = "Fastly Token for authentication" 8 | type = string 9 | sensitive = true 10 | } 11 | variable "DATADOG_API_KEY" { 12 | type = string 13 | description = "API key for Datadog logging" 14 | sensitive = true 15 | } 16 | variable "fastly_s3_logging" { 17 | type = map(string) 18 | description = "S3 bucket keys for Fastly logging" 19 | sensitive = true 20 | } 21 | variable "ngwaf_token" { 22 | type = string 23 | description = "Secret token for the NGWAF API." 24 | sensitive = true 25 | } 26 | -------------------------------------------------------------------------------- /jobs/feeds.py: -------------------------------------------------------------------------------- 1 | from django.contrib.syndication.views import Feed 2 | from django.urls import reverse_lazy 3 | 4 | from .models import Job 5 | 6 | 7 | class JobFeed(Feed): 8 | """ Python.org Jobs RSS Feed """ 9 | title = "Python.org Jobs Feed" 10 | description = "Python jobs from Python.org" 11 | link = reverse_lazy('jobs:job_list') 12 | 13 | def items(self): 14 | return Job.objects.approved()[:20] 15 | 16 | def item_title(self, item): 17 | return item.display_name 18 | 19 | def item_description(self, item): 20 | """ Description """ 21 | return '\n'.join([ 22 | item.display_location, 23 | item.description.rendered, 24 | item.requirements.rendered, 25 | ]) 26 | -------------------------------------------------------------------------------- /jobs/migrations/0007_auto_20150227_2223.py: -------------------------------------------------------------------------------- 1 | from django.db import models, migrations 2 | 3 | 4 | class Migration(migrations.Migration): 5 | 6 | dependencies = [ 7 | ('jobs', '0006_region_nullable'), 8 | ] 9 | 10 | operations = [ 11 | migrations.RemoveField( 12 | model_name='job', 13 | name='dt_end', 14 | ), 15 | migrations.RemoveField( 16 | model_name='job', 17 | name='dt_start', 18 | ), 19 | migrations.AddField( 20 | model_name='job', 21 | name='expires', 22 | field=models.DateTimeField(blank=True, null=True, verbose_name='Job Listing Expiration Date'), 23 | preserve_default=True, 24 | ), 25 | ] 26 | --------------------------------------------------------------------------------