├── .coveragerc ├── .editorconfig ├── .environment-example ├── .flake8 ├── .github ├── dependabot.yml └── workflows │ ├── codecov.yml │ ├── deploy.yml │ ├── django.yml │ └── flake8.yml ├── .gitignore ├── .node-version ├── .nvmrc ├── .pre-commit-config.yaml ├── Dockerfile ├── LICENSE ├── README.md ├── applications ├── __init__.py ├── admin.py ├── decorators.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20171216_2124.py │ ├── 0003_auto_20180529_0016.py │ ├── 0004_add_on_delete.py │ ├── 0005_auto_20210906_0915.py │ ├── 0006_auto_20221231_1925.py │ └── __init__.py ├── models.py ├── questions.py ├── services.py ├── templatetags │ ├── __init__.py │ └── applications_tags.py ├── urls.py └── views.py ├── coach ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_alter_coach_id.py │ ├── 0003_alter_coach_unique_together.py │ └── __init__.py ├── models.py ├── urls.py └── views.py ├── codecov.yml ├── contact ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_contactemail_event.py │ ├── 0003_auto_20171217_1144.py │ ├── 0004_alter_contactemail_id.py │ └── __init__.py ├── models.py ├── urls.py └── views.py ├── core ├── __init__.py ├── admin │ ├── __init__.py │ ├── event.py │ ├── event_page_content.py │ ├── event_page_menu.py │ ├── filters │ │ ├── __init__.py │ │ └── event.py │ ├── flat_page.py │ ├── forms │ │ ├── __init__.py │ │ ├── event_page_content.py │ │ └── user.py │ └── user.py ├── command_helpers.py ├── context_processors.py ├── default_eventpage_content.py ├── deploy_event.py ├── emails.py ├── event_list_pictures.json ├── filters.py ├── flickr_api_integration.py ├── forms.py ├── gmail_accounts.py ├── management │ ├── __init__.py │ └── commands │ │ ├── __init__.py │ │ ├── add_organizer.py │ │ ├── backup_postgres_to_s3.py │ │ ├── copy_event.py │ │ ├── handle_emails.py │ │ ├── new_event.py │ │ ├── prepare_dispatch.py │ │ ├── sync_events_dashboard.py │ │ └── update_coordinates.py ├── management_utils.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20171217_1144.py │ ├── 0003_auto_20210906_0915.py │ ├── 0004_auto_20220422_1316.py │ ├── 0005_auto_20220422_1321.py │ └── __init__.py ├── models.py ├── models │ ├── __init__.py │ ├── event.py │ ├── managers │ │ ├── __init__.py │ │ ├── event.py │ │ └── user.py │ └── user.py ├── quotes.py ├── sitemap.py ├── slack_client.py ├── templatetags │ ├── __init__.py │ ├── core_tags.py │ └── element_by_counter.py ├── tumblr_client.py ├── urls.py ├── utils.py ├── validators.py └── views.py ├── djangogirls ├── __init__.py ├── settings.py ├── urls.py ├── utils │ ├── __init__.py │ └── sanitize.py └── wsgi.py ├── docker-compose.yml ├── docker ├── pack-ea496196844d1e5caa5fb593f5c8a533805a6417.pack ├── pack-ea496196844d1e5caa5fb593f5c8a533805a6418.pack ├── pack-ea496196844d1e5caa5fb593f5c8a533805a6419.pack └── pack-ea496196844d1e5caa5fb593f5c8a533805a6420.pack ├── donations ├── __init__.py ├── apps.py ├── forms.py ├── urls.py └── views.py ├── globalpartners ├── __init__.py ├── admin.py ├── apps.py ├── emails.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_alter_globalpartner_sponsor_level_annual.py │ ├── 0003_globalpartner_description.py │ └── __init__.py └── models.py ├── gulp ├── config.js └── tasks │ ├── build.js │ ├── clean.js │ ├── copy.js │ ├── environment.js │ ├── local.js │ ├── revisioning.js │ ├── scripts.js │ ├── styles.js │ └── watch.js ├── gulpfile.js ├── jobboard ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20230202_1131.py │ └── __init__.py ├── models.py ├── urls.py └── views.py ├── locale ├── de │ └── LC_MESSAGES │ │ └── django.po ├── es │ └── LC_MESSAGES │ │ ├── django.mo │ │ └── django.po ├── fa │ └── LC_MESSAGES │ │ └── django.po ├── fr │ └── LC_MESSAGES │ │ ├── django.mo │ │ └── django.po ├── ko │ └── LC_MESSAGES │ │ └── django.po ├── pt-br │ └── LC_MESSAGES │ │ └── django.po ├── pt │ └── LC_MESSAGES │ │ └── django.po └── ru │ └── LC_MESSAGES │ └── django.po ├── manage.py ├── organize ├── __init__.py ├── admin.py ├── apps.py ├── constants.py ├── emails.py ├── forms.py ├── managers.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20171217_1144.py │ ├── 0003_auto_20190727_2013.py │ ├── 0004_auto_20201028_1923.py │ ├── 0005_eventapplication_additional.py │ ├── 0006_eventapplication_diversity.py │ ├── 0007_auto_20210906_1216.py │ ├── 0008_eventapplication_local_restrictions.py │ ├── 0009_eventapplication_confirm_covid_19_protocols.py │ └── __init__.py ├── models.py ├── urls.py └── views.py ├── package-lock.json ├── package.json ├── patreonmanager ├── __init__.py ├── admin.py ├── apps.py ├── filters.py ├── management │ ├── __init__.py │ └── commands │ │ ├── __init__.py │ │ ├── download_csv.py │ │ ├── fundraising_status.py │ │ ├── import_csv.py │ │ └── listpatrons.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20171217_1144.py │ ├── 0003_auto_20210906_0915.py │ └── __init__.py ├── models.py ├── templates │ └── admin │ │ └── patreonmanager │ │ └── patron │ │ └── change_form.html └── utils │ ├── __init__.py │ ├── csv.py │ └── download.py ├── pictures ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_alter_stockpicture_id.py │ └── __init__.py └── models.py ├── pyproject.toml ├── pytest.ini ├── requirements.in ├── requirements.txt ├── rootfs ├── entrypoint.sh └── healthcheck.sh ├── sample_db.json ├── sponsor ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_donor.py │ ├── 0003_auto_20210906_0915.py │ └── __init__.py ├── models.py ├── urls.py └── views.py ├── static └── source │ ├── css │ ├── admin.styl │ ├── common.styl │ ├── event.styl │ └── global.styl │ ├── img │ ├── favicon.ico │ ├── global │ │ ├── coach-empty.jpg │ │ ├── contribute │ │ │ ├── coach.jpg │ │ │ ├── debug.jpg │ │ │ ├── gitter.jpg │ │ │ ├── love.jpg │ │ │ ├── more.jpg │ │ │ ├── organize.jpg │ │ │ ├── translate.jpg │ │ │ └── tutoedit.jpg │ │ ├── django.png │ │ ├── donate │ │ │ ├── django_crowdfunding_heart.png │ │ │ ├── ghana.png │ │ │ ├── lagos.jpg │ │ │ └── tshirt.jpg │ │ ├── eventslist │ │ │ ├── picture01.jpg │ │ │ ├── picture02.jpg │ │ │ ├── picture03.jpg │ │ │ ├── picture04.jpg │ │ │ ├── picture05.jpg │ │ │ ├── picture06.jpg │ │ │ ├── picture07.jpg │ │ │ ├── picture08.jpg │ │ │ ├── picture10.jpg │ │ │ ├── picture11.jpg │ │ │ ├── picture12.jpg │ │ │ ├── picture13.jpg │ │ │ ├── picture14.jpg │ │ │ ├── picture15.jpg │ │ │ ├── picture16.jpg │ │ │ ├── picture17.jpg │ │ │ ├── picture18.jpg │ │ │ ├── picture19.jpg │ │ │ ├── picture20.jpg │ │ │ ├── picture21.jpg │ │ │ ├── picture22.jpg │ │ │ ├── picture23.jpg │ │ │ ├── picture24.jpg │ │ │ ├── picture25.jpg │ │ │ ├── picture26.jpg │ │ │ ├── picture27.jpg │ │ │ ├── picture28.jpg │ │ │ ├── picture29.jpg │ │ │ └── picture30.jpg │ │ ├── logo.png │ │ ├── mainphoto-04122015.jpg │ │ ├── mainphoto.jpg │ │ ├── map_icon.png │ │ ├── resources │ │ │ ├── coach.jpg │ │ │ ├── extensions.jpg │ │ │ ├── organize.jpg │ │ │ └── tutorial.jpg │ │ ├── supporters │ │ │ ├── JamBonSW.png │ │ │ ├── britecore.png │ │ │ ├── caktus-logo.png │ │ │ ├── developeo.png │ │ │ ├── divio.png │ │ │ ├── django.png │ │ │ ├── djangostars.png │ │ │ ├── elastic.png │ │ │ ├── eventbrite.png │ │ │ ├── flatirons.png │ │ │ ├── github.png │ │ │ ├── jetbrains.png │ │ │ ├── lincolnloop.png │ │ │ ├── linode.png │ │ │ ├── mailchimp.png │ │ │ ├── micropyramid.png │ │ │ ├── nexmo.png │ │ │ ├── niteo.png │ │ │ ├── oddlogo.png │ │ │ ├── opendataservices.png │ │ │ ├── posthog.png │ │ │ ├── potato.png │ │ │ ├── pythonanywhere.png │ │ │ ├── pythonsoftwarefoundation.png │ │ │ ├── readthedocs.png │ │ │ ├── rmotr.png │ │ │ ├── runcode.png │ │ │ ├── runcode_io.png │ │ │ ├── sentry.png │ │ │ ├── sherpany.png │ │ │ ├── sixfeetup.png │ │ │ ├── taiga.png │ │ │ ├── techdomains.png │ │ │ ├── torchbox.png │ │ │ ├── webucator.png │ │ │ └── wsp.png │ │ ├── tiwapll.jpg │ │ ├── tshirt.png │ │ └── woman.jpg │ ├── logo-bigger.png │ ├── logo-negative.png │ ├── logo.png │ ├── mapbox-icon.png │ ├── photos │ │ ├── about1.jpg │ │ ├── about2.jpg │ │ ├── apply.jpg │ │ ├── coach1.jpg │ │ ├── coach2.jpg │ │ ├── footer1.jpg │ │ ├── footer2.jpg │ │ ├── organize-1.jpg │ │ ├── organize-2.jpg │ │ └── organize-3.jpg │ └── report-2015 │ │ ├── agata.jpg │ │ ├── github.png │ │ ├── hello.jpg │ │ ├── maria.jpg │ │ ├── paivi.jpg │ │ ├── patreon.png │ │ ├── python.png │ │ └── report.jpg │ ├── js │ ├── applications.js │ ├── event.js │ ├── global.js │ └── organize.js │ └── vendor │ ├── codemirror │ ├── lib │ │ ├── codemirror.css │ │ └── codemirror.js │ └── mode │ │ └── xml │ │ └── xml.js │ ├── css │ └── sss.css │ ├── img │ └── arr.png │ ├── jquery-ui │ ├── images │ │ └── ui-icons_444444_256x240.png │ ├── jquery-ui.min.css │ └── jquery-ui.min.js │ ├── js │ ├── bootstrap.min.js │ ├── jquery.min.js │ └── sss.min.js │ ├── select2-bootstrap-theme │ ├── select2-bootstrap.css │ └── select2-bootstrap.min.css │ └── select2 │ ├── css │ └── select2.min.css │ └── js │ └── select2.min.js ├── story ├── __init__.py ├── admin.py ├── apps.py ├── management │ ├── __init__.py │ └── commands │ │ ├── __init__.py │ │ ├── fetch_stories.py │ │ └── fetch_tumblr_stories.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_alter_story_id.py │ └── __init__.py ├── models.py ├── sitemap.py ├── urls.py └── views.py ├── templates ├── 404.html ├── admin │ ├── applications │ │ └── form │ │ │ └── view_submissions.html │ ├── base_site.html │ ├── core │ │ └── event │ │ │ ├── change_form.html │ │ │ ├── view_add_organizers.html │ │ │ └── view_manage_organizers.html │ ├── globalpartners │ │ └── globalpartner │ │ │ └── change_form.html │ └── organize │ │ └── eventapplication │ │ ├── change_form.html │ │ └── view_change_status.html ├── applications │ ├── application_detail.html │ ├── applications.html │ ├── apply.html │ ├── communication.html │ ├── compose_email.html │ ├── event_not_live.html │ └── rsvp.html ├── contact │ └── contact.html ├── core │ ├── 2015.html │ ├── 2016-2017.html │ ├── coc.html │ ├── coc │ │ ├── en.html │ │ ├── es.html │ │ ├── fa.html │ │ ├── fr.html │ │ ├── ko.html │ │ ├── pt-br.html │ │ └── ru.html │ ├── contribute.html │ ├── crowdfunding_donors.html │ ├── event.html │ ├── events.html │ ├── events_map.html │ ├── faq.html │ ├── foundation.html │ ├── governing_document.html │ ├── index.html │ ├── map.html │ ├── newsletter.html │ ├── privacy_cookies.html │ ├── resources.html │ ├── terms_conditions.html │ ├── txt │ │ └── robots.txt │ └── workshop_box.html ├── default │ ├── about.html │ ├── apply.html │ ├── coach.html │ ├── faq.html │ ├── footer.html │ ├── partners.html │ └── values.html ├── donations │ ├── donate.html │ ├── error.html │ ├── sponsors.html │ └── success.html ├── emails │ ├── application_confirmation.html │ ├── event_thank_you.html │ ├── event_thank_you.txt │ ├── event_thank_you_subject.txt │ ├── existing_user.html │ ├── globalpartners │ │ ├── promotional_material.html │ │ ├── prospective_sponsor.html │ │ ├── renewal_email.html │ │ └── thank_you.html │ ├── new_user.html │ ├── offer_help_email.html │ ├── offer_help_email.txt │ ├── offer_help_subject.txt │ ├── organize │ │ ├── application_confirmation.html │ │ ├── application_notification.html │ │ ├── event_deployed.html │ │ └── rejection.html │ ├── setup-short.txt │ ├── setup.txt │ ├── submit_information_email.html │ ├── submit_information_email.txt │ └── submit_information_subject.txt ├── event │ ├── base.html │ ├── global_sponsors.html │ └── menu.html ├── flatpage.html ├── global │ ├── base.html │ ├── footer.html │ └── menu.html ├── includes │ ├── _coach.html │ ├── _event.html │ ├── _faq.html │ ├── _field.html │ ├── _form.html │ ├── _info_messages.html │ ├── _main_sponsors.html │ ├── _main_supporters.html │ ├── _no_event.html │ ├── _organize-progress.html │ ├── _sponsor.html │ ├── _story.html │ ├── item.html │ └── js.html ├── jobboard │ ├── index.html │ └── job.html ├── organize │ ├── commitment.html │ ├── confirmation-of-acceptance.html │ ├── form │ │ ├── step1_previous_event.html │ │ ├── step2_application.html │ │ ├── step3_organizers.html │ │ ├── step4_workshop_type.html │ │ ├── step5_workshop.html │ │ ├── step5_workshop_remote.html │ │ └── thank_you.html │ ├── index.html │ ├── prerequisites.html │ └── suspend.html ├── registration │ ├── base.html │ ├── password_reset_complete.html │ ├── password_reset_confirm.html │ ├── password_reset_done.html │ └── password_reset_form.html ├── sponsor │ └── sponsor-request.html └── story │ └── stories.html ├── tests ├── __init__.py ├── applications │ ├── __init__.py │ ├── conftest.py │ ├── models │ │ ├── __init__.py │ │ ├── conftest.py │ │ ├── test_applications.py │ │ ├── test_email.py │ │ ├── test_forms.py │ │ └── test_questions.py │ ├── test_forms.py │ ├── test_services.py │ ├── test_utils.py │ ├── vcr │ │ └── application_form_prevent_duplicate_emails.yaml │ └── views │ │ ├── __init__.py │ │ ├── conftest.py │ │ ├── test_applications.py │ │ ├── test_applications_download.py │ │ └── test_apply.py ├── coach │ ├── __init__.py │ └── test_models.py ├── conftest.py ├── contact │ ├── __init__.py │ └── test_views.py ├── core │ ├── __init__.py │ ├── conftest.py │ ├── emails │ │ ├── __init__.py │ │ └── test_offer_help.py │ ├── test_admin.py │ ├── test_commands.py │ ├── test_cron_emails.py │ ├── test_deploy_event.py │ ├── test_flickr_api_integration.py │ ├── test_forms.py │ ├── test_gmail_accounts.py │ ├── test_models.py │ ├── test_tumblr_client.py │ ├── test_utils.py │ ├── test_views.py │ └── vcr │ │ ├── gmail_accounts_create.yaml │ │ ├── gmail_accounts_get.yaml │ │ ├── gmail_accounts_migrate.yaml │ │ ├── new_event_short.yaml │ │ ├── new_event_with_one_organizer.yaml │ │ ├── new_event_with_two_organizers.yaml │ │ └── update_coordinates.yaml ├── donations │ ├── __init__.py │ └── test_views.py ├── globalpartners │ ├── __init__.py │ ├── conftest.py │ ├── test_admin.py │ └── test_models.py ├── jobboard │ ├── __init__.py │ ├── conftest.py │ ├── test_admin.py │ ├── test_models.py │ └── test_views.py ├── mocks │ ├── __init__.py │ └── slack.py ├── organize │ ├── __init__.py │ ├── conftest.py │ ├── test_create_event.py │ ├── test_forms.py │ ├── test_models.py │ ├── test_views.py │ └── vcr │ │ └── latlng.yaml ├── patreon │ ├── __init__.py │ ├── conftest.py │ ├── test_commands.py │ ├── test_filters.py │ ├── test_utils.py │ └── vcr │ │ └── patreon.yaml └── story │ ├── __init__.py │ ├── conftest.py │ ├── test_commands.py │ └── test_models.py └── work └── django_init.py /.coveragerc: -------------------------------------------------------------------------------- 1 | [run] 2 | source = . 3 | branch = True 4 | omit = 5 | **/management/* 6 | **/migrations/* 7 | **/tests/* 8 | .venv/* 9 | .env/* 10 | djangogirls/wsgi.py 11 | manage.py 12 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # top-most EditorConfig file 2 | root = true 3 | 4 | # Python 5 | [*.py] 6 | indent_size = 4 7 | indent_style = space 8 | max_line_length = 119 9 | 10 | # Javascript 11 | [*.{js,json}] 12 | indent_size = 2 13 | indent_style = space 14 | 15 | # HTML 16 | [*.html] 17 | indent_size = 4 18 | indent_style = space 19 | 20 | # CSS, SCSS, STYL 21 | [*.{css,scss}] 22 | indent_size = 4 23 | indent_style = space 24 | -------------------------------------------------------------------------------- /.environment-example: -------------------------------------------------------------------------------- 1 | # copy this file's contents into .environment and amend as required 2 | 3 | export DJANGO_SETTINGS_MODULE="djangogirls.settings" 4 | export CLEAN_PYC="TRUE" 5 | export COVERAGE="TRUE" 6 | export DJANGO_DEBUG="FALSE" 7 | export DEBUG_TOOLBAR="no" 8 | 9 | export POSTGRES_PASSWORD="" 10 | 11 | export DISABLE_RECAPTCHA="yes" 12 | export RECAPTCHA_USE_SSL="no" 13 | 14 | export MAILCHIMP_APIKEY="" 15 | 16 | export SENDGRID_API_KEY="" 17 | 18 | export RECAPTCHA_PUBLIC_KEY="" 19 | export RECAPTCHA_PRIVATE_KEY="" 20 | 21 | export SLACK_API_KEY="" 22 | 23 | export STORE_DISCOUNT_CODE="" 24 | 25 | export TRELLO_API_KEY="" 26 | 27 | export SENTRY_DSN="" 28 | 29 | export GAPPS_PRIVATE_KEY_ID="" 30 | export GAPPS_PRIVATE_KEY="" 31 | 32 | export STRIPE_PUBLIC_KEY="" 33 | export STRIPE_SECRET_KEY="" 34 | 35 | export FLICKR_DJANGO_GIRLS_USER_ID="128162583@N08" 36 | export FLICKR_API_KEY="" 37 | 38 | export TUMBLR_API_KEY="" 39 | export TUMBLR_API_BASE_URL="https://api.tumblr.com/v2" 40 | export TUMBLR_BLOG_HOSTNAME="blog.djangogirls.org" 41 | 42 | export MAPBOX_ACCESS_TOKEN="pk.eyJ1IjoiZGphbmdvZ2lybHMiLCJhIjoiY2xjeWU1dm9iMG10cTNudGdrYTBkYm0ycSJ9.Ah4y76VVmBWqzVkw3kUzFQ" 43 | -------------------------------------------------------------------------------- /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | # Explanation 3 | # E722 - do not use bare 'except' 4 | # F841 - local variable is assigned to but never used # TODO - address these 5 | # W503 - line break before binary operator # Black adds this line break 6 | 7 | ignore = E722, F841, W503 8 | exclude = 9 | .env, 10 | .git, 11 | .github, 12 | .pytest_cache, 13 | .venv, 14 | __pycache__, 15 | **/migrations/** 16 | max-line-length = 120 -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "github-actions" 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "monthly" 12 | 13 | - package-ecosystem: "npm" 14 | directory: "/" 15 | schedule: 16 | interval: "monthly" 17 | 18 | - package-ecosystem: "pip-compile" 19 | directory: "/" 20 | schedule: 21 | interval: "monthly" -------------------------------------------------------------------------------- /.github/workflows/codecov.yml: -------------------------------------------------------------------------------- 1 | name: CodeCov 2 | on: [push, pull_request] 3 | 4 | jobs: 5 | run: 6 | runs-on: ubuntu-latest 7 | env: 8 | OS: ubuntu-latest 9 | PYTHON: '3.10' 10 | 11 | strategy: 12 | max-parallel: 4 13 | matrix: 14 | python-version: 15 | - '3.10' 16 | 17 | services: 18 | postgres: 19 | image: postgres:10.8 20 | env: 21 | POSTGRES_USER: postgres 22 | POSTGRES_PASSWORD: postgres 23 | POSTGRES_DB: djangogirls 24 | ports: 25 | - 5432:5432 26 | # needed because the postgres container does not provide a healthcheck 27 | options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 28 | 29 | steps: 30 | - uses: actions/checkout@v2 31 | with: 32 | fetch-depth: '2' 33 | 34 | - name: Setup Python ${{ matrix.python-version }} 35 | uses: actions/setup-python@master 36 | with: 37 | python-version: ${{ matrix.python-version }} 38 | - name: Generate Report 39 | run: | 40 | pip install -r requirements.txt 41 | coverage run -m pytest 42 | coverage xml 43 | env: 44 | POSTGRES_DB: djangogirls 45 | POSTGRES_HOST: localhost 46 | POSTGRES_PASSWORD: postgres 47 | POSTGRES_USER: postgres 48 | - name: Upload Coverage to Codecov 49 | uses: codecov/codecov-action@v2 -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy to 🐍anywhere 2 | 3 | on: 4 | release: 5 | types: 6 | - published 7 | 8 | jobs: 9 | deploy: 10 | name: Deploy to 🐍anywhere 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v3 14 | - name: Set up Python 3.10 15 | uses: actions/setup-python@v4 16 | with: 17 | python-version: '3.10' 18 | 19 | - name: Run deploy script 20 | uses: appleboy/ssh-action@v0.1.7 21 | with: 22 | host: ${{ secrets.HOST }} 23 | username: ${{ secrets.USERNAME }} 24 | key: ${{ secrets.KEY }} 25 | port: ${{ secrets.PORT }} 26 | script: | 27 | ./deploy.sh -------------------------------------------------------------------------------- /.github/workflows/flake8.yml: -------------------------------------------------------------------------------- 1 | name: flake8 2 | 3 | on: 4 | pull_request: 5 | push: 6 | 7 | jobs: 8 | pre-commit: 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | - uses: actions/setup-python@v2 13 | - uses: pre-commit/action@v2.0.3 14 | with: 15 | extra_args: flake8 --all-files 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.sqlite3 3 | *.pyc 4 | .python-version 5 | staticfiles/ 6 | uploads/ 7 | local_settings.py 8 | .anvil/* 9 | __pycache__ 10 | .Python 11 | /bin 12 | /lib 13 | /src 14 | /include 15 | .coverage 16 | .venv 17 | static/media 18 | .idea/* 19 | .vscode 20 | .cache/ 21 | node_modules/ 22 | static/build/ 23 | static/local/ 24 | static/rev-manifest.json 25 | temp/ 26 | .environment 27 | htmlcov 28 | *google3ef9938c* 29 | -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | 14.16.1 2 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 14.17 -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.10.9-bullseye 2 | 3 | RUN apt-get update \ 4 | && apt-get upgrade -yq \ 5 | && apt-get install -yq --no-install-recommends \ 6 | nodejs \ 7 | npm 8 | 9 | ENV APP_DIR=/var/www/app 10 | WORKDIR ${APP_DIR} 11 | 12 | COPY requirements.txt ${APP_DIR}/requirements.txt 13 | 14 | RUN pip install pip-tools \ 15 | && pip-sync 16 | 17 | COPY package.json ${APP_DIR}/package.json 18 | 19 | RUN npm install \ 20 | && npm install -g gulp 21 | 22 | COPY rootfs / 23 | COPY . ${APP_DIR} 24 | 25 | RUN gulp local 26 | 27 | ENTRYPOINT ["/entrypoint.sh"] 28 | 29 | HEALTHCHECK \ 30 | --start-period=15s \ 31 | --timeout=2s \ 32 | --retries=3 \ 33 | --interval=5s \ 34 | CMD /healthcheck.sh 35 | -------------------------------------------------------------------------------- /applications/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/applications/__init__.py -------------------------------------------------------------------------------- /applications/decorators.py: -------------------------------------------------------------------------------- 1 | from functools import wraps 2 | 3 | from django.http import HttpResponseNotFound 4 | from django.shortcuts import redirect 5 | from django.utils.translation import gettext_lazy as _ 6 | 7 | from core.utils import get_event 8 | 9 | 10 | def organiser_only(function): 11 | """ 12 | Decorator for views that checks that the user is logged in and that 13 | they are a team member for a particular event. Returns 404 otherwise. 14 | """ 15 | 16 | @wraps(function) 17 | def decorator(request, *args, **kwargs): 18 | page_url = kwargs.get("page_url") 19 | 20 | if not page_url: 21 | raise ValueError(_('"page_url" slug must be present to use this decorator.')) 22 | 23 | if not request.user.is_authenticated: 24 | return redirect("core:event", page_url) 25 | 26 | event = get_event(page_url, request.user.is_authenticated, False) 27 | if event and (request.user in event.team.all() or request.user.is_superuser): 28 | return function(request, *args, **kwargs) 29 | return HttpResponseNotFound() 30 | 31 | return decorator 32 | -------------------------------------------------------------------------------- /applications/migrations/0003_auto_20180529_0016.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 1.11.7 on 2018-05-29 00:16 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("applications", "0002_auto_20171216_2124"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="form", 14 | name="confirmation_mail", 15 | field=models.TextField( 16 | default="Hi there!\n\nThis is a confirmation of your application to Django Girls {CITY}. Yay! That's a huge step already, we're proud of you!\n\nMind that this is not a confirmation of participation in the event, but a confirmation that we received your application.\n\nYou'll receive an email from the team that organizes Django Girls {CITY} soon. You can always reach them by answering to this email or by writing to {your event mail}.\nFor your reference, we're attaching your answers below.\n\nHugs, cupcakes and high-fives!\nDjango Girls", 17 | help_text="Mail will be sent from your event mail.\nAlso the answers will be attached.", 18 | ), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /applications/migrations/0006_auto_20221231_1925.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.14 on 2022-12-31 19:25 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("applications", "0005_auto_20210906_0915"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterUniqueTogether( 13 | name="application", 14 | unique_together=set(), 15 | ), 16 | migrations.AddConstraint( 17 | model_name="application", 18 | constraint=models.UniqueConstraint( 19 | condition=models.Q(("email__isnull", False)), 20 | fields=("form", "email"), 21 | name="unique_form_email_email_not_null", 22 | ), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /applications/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/applications/migrations/__init__.py -------------------------------------------------------------------------------- /applications/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/applications/templatetags/__init__.py -------------------------------------------------------------------------------- /applications/templatetags/applications_tags.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from django.utils.safestring import mark_safe 3 | 4 | register = template.Library() 5 | 6 | 7 | @register.simple_tag 8 | def display_sorting_arrow(name, current_order): 9 | is_reversed = False 10 | if f"-{name}" == current_order: 11 | is_reversed = True 12 | 13 | if is_reversed: 14 | return mark_safe(f'') 15 | else: 16 | return mark_safe(f'') 17 | -------------------------------------------------------------------------------- /applications/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from applications import views 4 | 5 | app_name = "applications" 6 | urlpatterns = [ 7 | path("/apply/", views.apply, name="apply"), 8 | path("/applications/", views.application_list, name="applications"), 9 | path("/applications/", views.application_detail, name="application_detail"), 10 | path("/applications/change_state/", views.change_state, name="change_state"), 11 | path("/applications/change_rsvp/", views.change_rsvp, name="change_rsvp"), 12 | path("/applications/download/", views.applications_csv, name="applications_csv"), 13 | path("/communication/", views.communication, name="communication"), 14 | path("/communication/compose/", views.compose_email, name="compose_email"), 15 | path("/communication/compose/", views.compose_email, name="compose_email"), 16 | path("/rsvp/", views.rsvp, name="rsvp"), 17 | ] 18 | -------------------------------------------------------------------------------- /coach/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/coach/__init__.py -------------------------------------------------------------------------------- /coach/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from coach.models import Coach 4 | from core.models import EventPageContent 5 | 6 | 7 | class CoachInline(admin.TabularInline): 8 | model = EventPageContent.coaches.through 9 | extra = 1 10 | verbose_name_plural = "Coaches" 11 | 12 | 13 | @admin.register(Coach) 14 | class CoachAdmin(admin.ModelAdmin): 15 | list_display = ("name", "photo_display_for_admin", "twitter_handle", "url") 16 | search_fields = ("name", "twitter_handle", "url") 17 | 18 | def get_queryset(self, request): 19 | qs = super().get_queryset(request) 20 | if request.user.is_superuser: 21 | return qs 22 | return qs.filter(eventpagecontent__event__team=request.user) 23 | 24 | def get_form(self, request, obj=None, **kwargs): 25 | form = super().get_form(request, obj, **kwargs) 26 | if not request.user.is_superuser: 27 | if "eventpagecontent" in form.base_fields: 28 | qs = EventPageContent.objects.filter(event__team=request.user) 29 | form.base_fields["eventpagecontent"].queryset = qs 30 | return form 31 | -------------------------------------------------------------------------------- /coach/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CoachConfig(AppConfig): 5 | name = "coach" 6 | -------------------------------------------------------------------------------- /coach/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 1.11.5 on 2017-12-16 21:24 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | initial = True 8 | 9 | dependencies = [] 10 | 11 | operations = [ 12 | migrations.CreateModel( 13 | name="Coach", 14 | fields=[ 15 | ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), 16 | ("name", models.CharField(max_length=200)), 17 | ( 18 | "twitter_handle", 19 | models.CharField( 20 | blank=True, help_text="No @, No http://, just username", max_length=200, null=True 21 | ), 22 | ), 23 | ( 24 | "photo", 25 | models.ImageField( 26 | blank=True, help_text="For best display keep it square", null=True, upload_to="event/coaches/" 27 | ), 28 | ), 29 | ("url", models.URLField(blank=True, null=True)), 30 | ], 31 | options={ 32 | "verbose_name_plural": "Coaches", 33 | "ordering": ("name",), 34 | }, 35 | ), 36 | ] 37 | -------------------------------------------------------------------------------- /coach/migrations/0002_alter_coach_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-09-06 09:15 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("coach", "0001_initial"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="coach", 14 | name="id", 15 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /coach/migrations/0003_alter_coach_unique_together.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.19 on 2023-05-16 01:35 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("coach", "0002_alter_coach_id"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterUniqueTogether( 13 | name="coach", 14 | unique_together={("name", "twitter_handle")}, 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /coach/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/coach/migrations/__init__.py -------------------------------------------------------------------------------- /coach/urls.py: -------------------------------------------------------------------------------- 1 | # from django.conf.urls import url 2 | 3 | app_name = "coach" 4 | urlpatterns = [ 5 | # url(r'^$', .as_view(), name='coach'), 6 | ] 7 | -------------------------------------------------------------------------------- /coach/views.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/coach/views.py -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | coverage: 2 | precision: 2 3 | round: down 4 | 5 | notify: 6 | slack: 7 | default: 8 | url: "https://hooks.slack.com/services/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" 9 | branches: master 10 | threshold: "0.5%" 11 | attachments: "sunburst, diff" 12 | 13 | ignore: 14 | - tests/* 15 | - migrations/* 16 | - djangogirls/wsgi.py 17 | - core/gmail_accounts.py 18 | -------------------------------------------------------------------------------- /contact/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/contact/__init__.py -------------------------------------------------------------------------------- /contact/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import ContactEmail 4 | 5 | 6 | @admin.register(ContactEmail) 7 | class ContactEmailAdmin(admin.ModelAdmin): 8 | list_display = ("name", "sent_to", "event", "created_at", "sent_successfully") 9 | list_filter = ("sent_to",) 10 | search_fields = ( 11 | "sent_to", 12 | "event", 13 | ) 14 | readonly_fields = ( 15 | "name", 16 | "email", 17 | "sent_to", 18 | "message", 19 | "event", 20 | "contact_type", 21 | "created_at", 22 | "sent_successfully", 23 | ) 24 | -------------------------------------------------------------------------------- /contact/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ContactConfig(AppConfig): 5 | name = "contact" 6 | -------------------------------------------------------------------------------- /contact/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from django.conf import settings 3 | from django.utils.translation import gettext_lazy as _ 4 | from django_bleach.forms import BleachField 5 | 6 | from contact.models import ContactEmail 7 | from core.forms import BetterReCaptchaField, EventChoiceField 8 | from core.models import Event 9 | 10 | 11 | class ContactForm(forms.ModelForm): 12 | event = EventChoiceField( 13 | queryset=Event.objects.public().distinct("city", "country").order_by("city"), 14 | required=False, 15 | label=_("Django Girls workshop in..."), 16 | ) 17 | captcha = BetterReCaptchaField() 18 | message = BleachField() 19 | 20 | class Meta: 21 | model = ContactEmail 22 | fields = ( 23 | "name", 24 | "email", 25 | "contact_type", 26 | "event", 27 | "message", 28 | ) 29 | widgets = {"contact_type": forms.RadioSelect} 30 | 31 | def __init__(self, *args, **kwargs): 32 | super().__init__(*args, **kwargs) 33 | 34 | if settings.RECAPTCHA_TESTING: 35 | del self.fields["captcha"] 36 | 37 | def clean_event(self): 38 | contact_type = self.cleaned_data.get("contact_type") 39 | event = self.cleaned_data.get("event") 40 | if contact_type == ContactEmail.CHAPTER: 41 | if not event: 42 | raise forms.ValidationError(_("Please select the event")) 43 | return event 44 | -------------------------------------------------------------------------------- /contact/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 1.11.5 on 2017-12-16 21:24 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | initial = True 8 | 9 | dependencies = [] 10 | 11 | operations = [ 12 | migrations.CreateModel( 13 | name="ContactEmail", 14 | fields=[ 15 | ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), 16 | ("name", models.CharField(max_length=128)), 17 | ("email", models.EmailField(max_length=128)), 18 | ("sent_to", models.EmailField(max_length=128)), 19 | ("message", models.TextField()), 20 | ( 21 | "contact_type", 22 | models.CharField( 23 | choices=[ 24 | ("chapter", "Django Girls Local Organizers"), 25 | ("support", "Django Girls HQ (Support Team)"), 26 | ], 27 | default="chapter", 28 | max_length=20, 29 | verbose_name="Who do you want to contact?", 30 | ), 31 | ), 32 | ("created_at", models.DateTimeField(auto_now_add=True)), 33 | ("sent_successfully", models.BooleanField(default=True)), 34 | ], 35 | options={ 36 | "ordering": ("-created_at",), 37 | }, 38 | ), 39 | ] 40 | -------------------------------------------------------------------------------- /contact/migrations/0002_contactemail_event.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 1.11.5 on 2017-12-16 21:24 2 | 3 | import django.db.models.deletion 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | initial = True 9 | 10 | dependencies = [ 11 | ("contact", "0001_initial"), 12 | ("core", "0001_initial"), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name="contactemail", 18 | name="event", 19 | field=models.ForeignKey( 20 | blank=True, 21 | help_text="required for contacting a chapter", 22 | null=True, 23 | on_delete=django.db.models.deletion.CASCADE, 24 | to="core.Event", 25 | ), 26 | ), 27 | ] 28 | -------------------------------------------------------------------------------- /contact/migrations/0003_auto_20171217_1144.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0 on 2017-12-17 11:44 2 | 3 | import django.db.models.deletion 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | dependencies = [ 9 | ("contact", "0002_contactemail_event"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name="contactemail", 15 | name="event", 16 | field=models.ForeignKey( 17 | blank=True, 18 | help_text="required for contacting a chapter", 19 | null=True, 20 | on_delete=django.db.models.deletion.SET_NULL, 21 | to="core.Event", 22 | ), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /contact/migrations/0004_alter_contactemail_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-09-06 09:15 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("contact", "0003_auto_20171217_1144"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="contactemail", 14 | name="id", 15 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /contact/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/contact/migrations/__init__.py -------------------------------------------------------------------------------- /contact/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from contact.views import ContactView 4 | 5 | app_name = "contact" 6 | urlpatterns = [ 7 | path("", ContactView.as_view(), name="landing"), 8 | ] 9 | -------------------------------------------------------------------------------- /contact/views.py: -------------------------------------------------------------------------------- 1 | from django.contrib import messages 2 | from django.urls import reverse_lazy 3 | from django.utils.translation import gettext_lazy as _ 4 | from django.views.generic.edit import FormView 5 | 6 | from contact.forms import ContactForm 7 | 8 | 9 | class ContactView(FormView): 10 | form_class = ContactForm 11 | template_name = "contact/contact.html" 12 | success_url = reverse_lazy("contact:landing") 13 | 14 | def form_valid(self, form): 15 | contact_email = form.save() 16 | if contact_email.sent_successfully: 17 | messages.info(self.request, _("Thank you for your email. We will be in touch shortly.")) 18 | else: 19 | messages.error(self.request, _("Ooops. We couldn't send your email :( Please try again later")) 20 | return super().form_valid(form) 21 | -------------------------------------------------------------------------------- /core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/core/__init__.py -------------------------------------------------------------------------------- /core/admin/__init__.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.contrib.flatpages.models import FlatPage 3 | 4 | from core.admin.event import EventAdmin 5 | from core.admin.event_page_content import EventPageContentAdmin 6 | from core.admin.event_page_menu import EventPageMenuAdmin 7 | from core.admin.flat_page import MyFlatPageAdmin 8 | from core.admin.user import UserAdmin 9 | from core.models import Event, EventPageContent, EventPageMenu, User 10 | 11 | admin.site.unregister(FlatPage) 12 | admin.site.register(FlatPage, MyFlatPageAdmin) 13 | admin.site.register(Event, EventAdmin) 14 | admin.site.register(EventPageContent, EventPageContentAdmin) 15 | admin.site.register(EventPageMenu, EventPageMenuAdmin) 16 | admin.site.register(User, UserAdmin) 17 | -------------------------------------------------------------------------------- /core/admin/event_page_menu.py: -------------------------------------------------------------------------------- 1 | from adminsortable2.admin import SortableAdminMixin 2 | from django.contrib import admin 3 | 4 | from core.admin.filters.event import EventFilter 5 | from core.models import Event 6 | 7 | 8 | class EventPageMenuAdmin(SortableAdminMixin, admin.ModelAdmin): 9 | list_display = ("title", "event", "url", "position") 10 | list_filter = (EventFilter,) 11 | sortable = "position" 12 | 13 | def get_queryset(self, request): 14 | qs = super().get_queryset(request) 15 | if request.user.is_superuser: 16 | return qs 17 | return qs.filter(event__team=request.user) 18 | 19 | def get_form(self, request, obj=None, **kwargs): 20 | form = super().get_form(request, obj, **kwargs) 21 | if not request.user.is_superuser: 22 | if "event" in form.base_fields: 23 | form.base_fields["event"].queryset = Event.objects.filter(team=request.user) 24 | return form 25 | 26 | def get_readonly_fields(self, request, obj=None): 27 | if obj and not request.user.is_superuser: 28 | # Don't let change objects for events that already happened 29 | if not obj.event.is_upcoming(): 30 | return {x.name for x in self.model._meta.fields} 31 | return self.readonly_fields 32 | -------------------------------------------------------------------------------- /core/admin/filters/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/core/admin/filters/__init__.py -------------------------------------------------------------------------------- /core/admin/filters/event.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from core.models import Event 4 | 5 | 6 | class EventFilter(admin.SimpleListFilter): 7 | title = "Event" 8 | parameter_name = "event" 9 | 10 | def lookups(self, request, queryset): 11 | qs = Event.objects.all() 12 | if not request.user.is_superuser: 13 | qs = qs.filter(team__in=[request.user]) 14 | return map(lambda x: (x.id, str(x)), qs) 15 | 16 | def queryset(self, request, queryset): 17 | if self.value(): 18 | return queryset.filter(event=self.value()) 19 | 20 | return queryset 21 | -------------------------------------------------------------------------------- /core/admin/flat_page.py: -------------------------------------------------------------------------------- 1 | from django.contrib.flatpages.admin import FlatPageAdmin, FlatpageForm 2 | from django.forms import CharField 3 | from django.utils.translation import gettext_lazy as _ 4 | 5 | 6 | class MyFlatPageAdmin(FlatPageAdmin): 7 | class MyFlatpageForm(FlatpageForm): 8 | template_name = CharField( 9 | initial="flatpage.html", help_text=_("Change this only if you know what you are doing") 10 | ) 11 | 12 | form = MyFlatpageForm 13 | -------------------------------------------------------------------------------- /core/admin/forms/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/core/admin/forms/__init__.py -------------------------------------------------------------------------------- /core/admin/forms/event_page_content.py: -------------------------------------------------------------------------------- 1 | import tinymce 2 | from django import forms 3 | from tinymce.widgets import AdminTinyMCE 4 | 5 | 6 | class EventPageContentForm(forms.ModelForm): 7 | class Meta: 8 | widgets = { 9 | "content": AdminTinyMCE( 10 | mce_attrs={ 11 | "plugins": tinymce.settings.DEFAULT_CONFIG["plugins"] + " | code", 12 | "toolbar": tinymce.settings.DEFAULT_CONFIG["toolbar"] + " | code", 13 | }, 14 | ) 15 | } 16 | fields = ( 17 | "event", 18 | "name", 19 | "content", 20 | "background", 21 | "position", 22 | "is_public", 23 | ) 24 | -------------------------------------------------------------------------------- /core/admin/forms/user.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from django.utils.translation import gettext_lazy as _ 3 | 4 | from core.models import User 5 | 6 | 7 | class UserCreationForm(forms.ModelForm): 8 | error_messages = { 9 | "password_mismatch": _("The two password fields didn't match."), 10 | } 11 | password1 = forms.CharField(label=_("Password"), widget=forms.PasswordInput) 12 | password2 = forms.CharField( 13 | label=_("Password confirmation"), 14 | widget=forms.PasswordInput, 15 | help_text=_("Enter the same password as above, for verification."), 16 | ) 17 | 18 | class Meta: 19 | model = User 20 | fields = ("email",) 21 | 22 | def clean_password2(self): 23 | password1 = self.cleaned_data.get("password1") 24 | password2 = self.cleaned_data.get("password2") 25 | if password1 and password2 and password1 != password2: 26 | raise forms.ValidationError( 27 | self.error_messages["password_mismatch"], 28 | code="password_mismatch", 29 | ) 30 | return password2 31 | 32 | def save(self, commit=True): 33 | user = super().save(commit=False) 34 | user.set_password(self.cleaned_data["password1"]) 35 | if commit: 36 | user.save() 37 | return user 38 | 39 | 40 | class UserLimitedChangeForm(forms.ModelForm): 41 | class Meta: 42 | model = User 43 | fields = ("email", "first_name", "last_name") 44 | -------------------------------------------------------------------------------- /core/command_helpers.py: -------------------------------------------------------------------------------- 1 | import djclick as click 2 | 3 | from core.utils import get_approximate_date 4 | 5 | 6 | def gather_event_date_from_prompt(): 7 | date = None 8 | while date is None: 9 | date_str = click.prompt( 10 | click.style("What is the date of the event? (Format: DD/MM/YYYY or MM/YYYY)", bold=True, fg="yellow") 11 | ) 12 | date = get_approximate_date(date_str) 13 | if date is None: 14 | click.secho("Wrong format! Try again :)", bold=True, fg="red") 15 | 16 | return date 17 | -------------------------------------------------------------------------------- /core/context_processors.py: -------------------------------------------------------------------------------- 1 | from django.db.models import Sum 2 | 3 | from globalpartners.models import GlobalPartner 4 | 5 | from .models import Event, User 6 | 7 | 8 | def statistics(request): 9 | future_events = Event.objects.future() 10 | past_events = Event.objects.past() 11 | countries = Event.objects.values("country").distinct() 12 | attendees = Event.objects.all().aggregate(attendees=Sum("attendees_count"), applicants=Sum("applicants_count")) 13 | organizers = User.objects.filter(is_active=True) 14 | global_partners = GlobalPartner.objects.filter(is_displayed=True) 15 | bronze = global_partners.filter(sponsor_level_annual=500) 16 | diamond = global_partners.filter(sponsor_level_annual=10000) 17 | gold = global_partners.filter(sponsor_level_annual=2500) 18 | platinum = global_partners.filter(sponsor_level_annual=5000) 19 | silver = global_partners.filter(sponsor_level_annual=1000) 20 | bronze = global_partners.filter(sponsor_level_annual=500) 21 | 22 | return { 23 | "past_events_count": past_events.count(), 24 | "future_events_count": future_events.count(), 25 | "all_events_count": past_events.count() + future_events.count(), 26 | "countries_count": countries.count(), 27 | "attendees_sum": attendees["attendees"], 28 | "applicants_sum": attendees["applicants"], 29 | "organizers_count": organizers.count(), 30 | "bronze": bronze, 31 | "diamond": diamond, 32 | "gold": gold, 33 | "platinum": platinum, 34 | "silver": silver, 35 | "bronze": bronze, 36 | } 37 | -------------------------------------------------------------------------------- /core/emails.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from django.core.mail import EmailMessage 3 | from django.template.loader import render_to_string 4 | 5 | 6 | def notify_existing_user(user, event): 7 | """Sends e-mail to existing organizer, that they're added 8 | to the new Event. 9 | """ 10 | content = render_to_string("emails/existing_user.html", {"user": user, "event": event}) 11 | subject = "You have been granted access to new Django Girls event" 12 | send_email(content, subject, [user.email]) 13 | 14 | 15 | def notify_new_user(user, event, password, errors=None): 16 | """Sends e-mail to newly created organizer that their account was created 17 | and that they were added to the Event. 18 | """ 19 | content = render_to_string( 20 | "emails/new_user.html", 21 | { 22 | "user": user, 23 | "event": event, 24 | "password": password, 25 | "errors": errors, 26 | }, 27 | ) 28 | subject = "Access to Django Girls website" 29 | send_email(content, subject, [user.email]) 30 | 31 | 32 | def send_email(content, subject, recipients, reply_to=None): 33 | msg = EmailMessage(subject, content, settings.DEFAULT_FROM_EMAIL, recipients, reply_to=reply_to) 34 | msg.content_subtype = "html" 35 | msg.send() 36 | -------------------------------------------------------------------------------- /core/filters.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.utils import timezone 3 | from django.utils.translation import gettext_lazy as _ 4 | 5 | 6 | class OpenRegistrationFilter(admin.SimpleListFilter): 7 | title = _("Open registration") 8 | parameter_name = "open_registration" 9 | 10 | def lookups(self, request, model_admin): 11 | return (("open", _("Show events with open registration")),) 12 | 13 | def queryset(self, request, queryset): 14 | if self.value() == "open": 15 | now = timezone.now() 16 | return queryset.filter(form__open_from__lte=now, form__open_until__gte=now) 17 | -------------------------------------------------------------------------------- /core/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/core/management/__init__.py -------------------------------------------------------------------------------- /core/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/core/management/commands/__init__.py -------------------------------------------------------------------------------- /core/management/commands/update_coordinates.py: -------------------------------------------------------------------------------- 1 | from django.core.management.base import BaseCommand 2 | 3 | from core.models import Event 4 | from core.utils import get_coordinates_for_city 5 | 6 | 7 | class Command(BaseCommand): 8 | help = "Update coordinates of event cities" 9 | 10 | def handle(self, *args, **options): 11 | events = Event.objects.all() 12 | 13 | for event in events: 14 | self.stdout.write(f"{event.city}, {event.country}") 15 | event.latlng = get_coordinates_for_city(event.city, event.country) 16 | self.stdout.write(f"{event.latlng}") 17 | event.save() 18 | -------------------------------------------------------------------------------- /core/migrations/0002_auto_20171217_1144.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0 on 2017-12-17 11:44 2 | 3 | import django.db.models.deletion 4 | from django.conf import settings 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | dependencies = [ 10 | ("core", "0001_initial"), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name="event", 16 | name="main_organizer", 17 | field=models.ForeignKey( 18 | blank=True, 19 | null=True, 20 | on_delete=django.db.models.deletion.SET_NULL, 21 | related_name="main_organizer", 22 | to=settings.AUTH_USER_MODEL, 23 | ), 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /core/migrations/0003_auto_20210906_0915.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-09-06 09:15 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("core", "0002_auto_20171217_1144"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="event", 14 | name="id", 15 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"), 16 | ), 17 | migrations.AlterField( 18 | model_name="eventpagecontent", 19 | name="id", 20 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"), 21 | ), 22 | migrations.AlterField( 23 | model_name="eventpagemenu", 24 | name="id", 25 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"), 26 | ), 27 | migrations.AlterField( 28 | model_name="user", 29 | name="id", 30 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"), 31 | ), 32 | ] 33 | -------------------------------------------------------------------------------- /core/migrations/0004_auto_20220422_1316.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2022-04-22 13:16 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("core", "0003_auto_20210906_0915"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="event", 14 | name="is_frozen", 15 | field=models.BooleanField(default=False, verbose_name="Event frozen because of some irregularities"), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /core/migrations/0005_auto_20220422_1321.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2022-04-22 13:21 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("core", "0004_auto_20220422_1316"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="event", 14 | name="is_frozen", 15 | field=models.BooleanField(default=False, verbose_name="Event frozen"), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /core/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/core/migrations/__init__.py -------------------------------------------------------------------------------- /core/models.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/core/models.py -------------------------------------------------------------------------------- /core/models/__init__.py: -------------------------------------------------------------------------------- 1 | from .event import Event, EventPageContent, EventPageMenu 2 | from .user import User, invite_user_to_slack 3 | 4 | __all__ = ["Event", "EventPageContent", "EventPageMenu", "User", "invite_user_to_slack"] 5 | -------------------------------------------------------------------------------- /core/models/managers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/core/models/managers/__init__.py -------------------------------------------------------------------------------- /core/models/managers/event.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | 3 | from django.db import models 4 | 5 | 6 | class EventManager(models.Manager): 7 | def get_queryset(self): 8 | return super().get_queryset().filter(is_deleted=False) 9 | 10 | def public(self): 11 | """ 12 | Only include events that are on the homepage. 13 | """ 14 | return self.get_queryset().filter(is_on_homepage=True) 15 | 16 | def future(self): 17 | return self.public().filter(date__gte=datetime.now().strftime("%Y-%m-%d")).order_by("date") 18 | 19 | def past(self): 20 | return self.public().filter(date__isnull=False, date__lt=datetime.now().strftime("%Y-%m-%d")).order_by("-date") 21 | -------------------------------------------------------------------------------- /core/models/managers/user.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth import models as auth_models 2 | 3 | 4 | class UserManager(auth_models.BaseUserManager): 5 | def create_user(self, email, password=None): 6 | if not email: 7 | raise ValueError("Users must have an email address") 8 | user = self.model(email=self.normalize_email(email)) 9 | user.set_password(password) 10 | user.save(using=self._db) 11 | return user 12 | 13 | def create_superuser(self, email, password): 14 | user = self.create_user(email, password=password) 15 | user.is_superuser = user.is_staff = True 16 | user.save(using=self._db) 17 | return user 18 | -------------------------------------------------------------------------------- /core/sitemap.py: -------------------------------------------------------------------------------- 1 | from django.contrib.sitemaps import Sitemap 2 | from django.shortcuts import reverse 3 | 4 | 5 | class StaticViewSitemap(Sitemap): 6 | def items(self): 7 | return [ 8 | "core:index", 9 | "core:foundation", 10 | "core:foundation-governing-document", 11 | "core:contribute", 12 | "core:year_2015", 13 | "core:year_2016_2017", 14 | "core:events", 15 | "core:newsletter", 16 | "core:resources", 17 | "donations:index", 18 | "organize:index", 19 | ] 20 | 21 | def location(self, item): 22 | return reverse(item) 23 | -------------------------------------------------------------------------------- /core/slack_client.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from slack_sdk import WebClient 3 | 4 | slack_client = WebClient(token=settings.SLACK_BOT_TOKEN) 5 | 6 | 7 | def invite_user_to_slack(email, first_name): 8 | return slack_client.admin_users_invite( 9 | channel_ids=settings.SLACK_INVITE_CHANNEL_IDS, 10 | team_id=settings.SLACK_TEAM_ID, 11 | email=email, 12 | first_name=first_name, 13 | set_active=True, 14 | ) 15 | 16 | 17 | def post_message_to_slack(channel: str, message: str): 18 | return slack_client.chat_postMessage( 19 | channel=channel, text=message, username="Django Girls", icon_emoji=":django_heart:" 20 | ) 21 | -------------------------------------------------------------------------------- /core/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/core/templatetags/__init__.py -------------------------------------------------------------------------------- /core/templatetags/core_tags.py: -------------------------------------------------------------------------------- 1 | from urllib.parse import urlparse 2 | 3 | from django.template import Library 4 | 5 | register = Library() 6 | 7 | 8 | @register.simple_tag 9 | def build_menu_item_url(menu_url, event_page_url): 10 | parse_result = urlparse(menu_url) 11 | if parse_result.netloc: # A full URI with domain. 12 | return menu_url 13 | elif parse_result.path.startswith("/"): # Absolute path. 14 | return menu_url 15 | return f"/{event_page_url}/{menu_url}" 16 | -------------------------------------------------------------------------------- /core/templatetags/element_by_counter.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | 3 | register = template.Library() 4 | 5 | 6 | @register.simple_tag 7 | def element_by_counter(data, counter, divider): 8 | if divider == 0: 9 | return "" 10 | else: 11 | index = int(counter / divider) 12 | if index < len(data): 13 | return data[index] 14 | return "" 15 | -------------------------------------------------------------------------------- /core/validators.py: -------------------------------------------------------------------------------- 1 | from datetime import date, timedelta 2 | 3 | from django.core.exceptions import ValidationError 4 | from django.utils.translation import gettext_lazy as _ 5 | from urlextract import URLExtract 6 | 7 | today = date.today() 8 | 9 | 10 | def validate_approximatedate(e_date): 11 | if e_date.month == 0: 12 | raise ValidationError(_("Event date can't be a year only. " "Please, provide at least a month and a year.")) 13 | 14 | 15 | def validate_event_date(e_date): 16 | if date(e_date.year, e_date.month, e_date.day) - today < timedelta(days=90): 17 | raise ValidationError( 18 | _("Your event date is too close. " "Workshop date should be at least 3 months (90 days) from now.") 19 | ) 20 | 21 | 22 | def validate_future_date(e_date): 23 | if date(e_date.year, e_date.month, e_date.day) - today < timedelta(days=0): 24 | raise ValidationError(_("Event date should be in the future")) 25 | 26 | 27 | def validate_local_restrictions(local_restrictions): 28 | extractor = URLExtract() 29 | if not extractor.has_urls(local_restrictions): 30 | raise ValidationError(_("Please provide a link to your government website outlining this.")) 31 | -------------------------------------------------------------------------------- /djangogirls/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/djangogirls/__init__.py -------------------------------------------------------------------------------- /djangogirls/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/djangogirls/utils/__init__.py -------------------------------------------------------------------------------- /djangogirls/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for djangogirls project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangogirls.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | 3 | services: 4 | app: 5 | container_name: djangogirls-app 6 | build: 7 | context: . 8 | stdin_open: true 9 | tty: true 10 | init: true 11 | environment: 12 | - POSTGRES_USER=djangogirls 13 | - POSTGRES_PASSWORD=djangogirls 14 | - POSTGRES_HOST=db 15 | - POSTGRES_PORT=5432 16 | - POSTGRES_DB=djangogirls 17 | depends_on: 18 | - db 19 | volumes: 20 | - .:/var/www/app 21 | ports: 22 | - "${APP_PORT:-8000}:8000" 23 | 24 | db: 25 | container_name: djangogirls-db 26 | image: postgres:15.1 27 | environment: 28 | POSTGRES_USER: djangogirls 29 | POSTGRES_PASSWORD: djangogirls 30 | POSTGRES_DB: djangogirls 31 | volumes: 32 | - pgdata:/var/lib/postgresql/data 33 | ports: 34 | - "${DB_PORT:-5432}:5432" 35 | 36 | volumes: 37 | pgdata: 38 | -------------------------------------------------------------------------------- /donations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/donations/__init__.py -------------------------------------------------------------------------------- /donations/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class DonationsConfig(AppConfig): 5 | name = "donations" 6 | -------------------------------------------------------------------------------- /donations/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | 3 | 4 | class StripeForm(forms.Form): 5 | """Form for handling stripe donations""" 6 | 7 | DONATION_CHOICES = ( 8 | ("10", "10"), 9 | ("25", "25"), 10 | ("50", "50"), 11 | ("100", "100"), 12 | ) 13 | CURRENCY_CHOICES = ( 14 | ("usd", "$ (US dollars)"), 15 | ("eur", "€ (Euro)"), 16 | ("gbp", "£ (GBP)"), 17 | ) 18 | 19 | currency = forms.ChoiceField(choices=CURRENCY_CHOICES) 20 | amount = forms.ChoiceField(choices=DONATION_CHOICES) 21 | email = forms.EmailField() 22 | name = forms.CharField() 23 | -------------------------------------------------------------------------------- /donations/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | app_name = "donations" 6 | 7 | urlpatterns = [ 8 | path("", views.index, name="index"), 9 | path("charge/", views.charge, name="charge"), 10 | path("success///", views.success, name="success"), 11 | path("error/", views.error, name="error"), 12 | path("sponsors/", views.sponsors, name="sponsors"), 13 | ] 14 | -------------------------------------------------------------------------------- /globalpartners/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/globalpartners/__init__.py -------------------------------------------------------------------------------- /globalpartners/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class GlobalpartnersConfig(AppConfig): 5 | default_auto_field = "django.db.models.BigAutoField" 6 | name = "globalpartners" 7 | -------------------------------------------------------------------------------- /globalpartners/migrations/0002_alter_globalpartner_sponsor_level_annual.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.16 on 2023-02-22 15:08 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("globalpartners", "0001_initial"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="globalpartner", 14 | name="sponsor_level_annual", 15 | field=models.IntegerField( 16 | blank=True, 17 | choices=[ 18 | (500, "Bronze ($500)"), 19 | (1000, "Silver ($1000)"), 20 | (2500, "Gold ($2,500)"), 21 | (5000, "Platinum ($5,000)"), 22 | (10000, "Diamond ($10,000)"), 23 | ], 24 | null=True, 25 | ), 26 | ), 27 | ] 28 | -------------------------------------------------------------------------------- /globalpartners/migrations/0003_globalpartner_description.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-03-08 20:38 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("globalpartners", "0002_alter_globalpartner_sponsor_level_annual"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="globalpartner", 14 | name="description", 15 | field=models.TextField(blank=True, max_length=1000, null=True), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /globalpartners/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/globalpartners/migrations/__init__.py -------------------------------------------------------------------------------- /gulp/config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | paths: { 3 | project: './', 4 | css: { 5 | src: [ 6 | './static/source/css/*.styl', 7 | '!./static/source/css/common.styl' 8 | ], 9 | dest: { 10 | production: './static/build/css/', 11 | development: './static/local/css/', 12 | }, 13 | bundles: { 14 | global: [ 15 | './node_modules/bootstrap/dist/css/bootstrap.min.css', 16 | './static/source/vendor/css/sss.css', 17 | './temp/global.css' 18 | ], 19 | event: [ 20 | './node_modules/bootstrap/dist/css/bootstrap.min.css', 21 | './temp/event.css' 22 | ], 23 | admin: [ 24 | './temp/admin.css' 25 | ] 26 | } 27 | }, 28 | js: { 29 | src: [ 30 | './static/source/js/*.js' 31 | ], 32 | dest: { 33 | production: './static/build/js/', 34 | development: './static/local/js/', 35 | } 36 | }, 37 | copy: { 38 | src: [ 39 | './static/source/**', 40 | '!./static/source/css/', 41 | '!./static/source/css/**', 42 | '!./static/source/js/', 43 | '!./static/source/js/**' 44 | ], 45 | dest: { 46 | production: './static/build/', 47 | development: './static/local/', 48 | } 49 | }, 50 | manifest: './static/', 51 | revisioning: ['./static/build/css/*.css', './static/build/js/*.js'], 52 | temp: './temp/' 53 | } 54 | }; 55 | -------------------------------------------------------------------------------- /gulp/tasks/build.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { series } = require("gulp"); 4 | 5 | const setProduction = require("./environment"); 6 | const local = require("./local"); 7 | const revisioning = require("./revisioning"); 8 | 9 | /** 10 | * A production build is a local build with a different environment and revision control enabled 11 | */ 12 | const buildTask = series(setProduction, local, revisioning); 13 | 14 | module.exports = buildTask; 15 | -------------------------------------------------------------------------------- /gulp/tasks/clean.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const del = require("del"); 4 | 5 | const config = require("../config"); 6 | 7 | /** 8 | * removes the files created during local and production builds 9 | */ 10 | const cleanTask = async () => { 11 | await del(config.paths.copy.dest.development); 12 | await del(config.paths.copy.dest.production); 13 | await del(config.paths.temp); 14 | }; 15 | 16 | module.exports = cleanTask; 17 | -------------------------------------------------------------------------------- /gulp/tasks/copy.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { src, dest } = require("gulp"); 4 | const { production } = require("gulp-environments"); 5 | 6 | const config = require("../config"); 7 | 8 | /** 9 | * copies generated files to their final place (depending on environment) 10 | */ 11 | const copyFilesTask = () => { 12 | const destination = production() 13 | ? config.paths.copy.dest.production 14 | : config.paths.copy.dest.development; 15 | return src(config.paths.copy.src).pipe(dest(destination)); 16 | }; 17 | 18 | module.exports = copyFilesTask; 19 | -------------------------------------------------------------------------------- /gulp/tasks/environment.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { production, current } = require("gulp-environments"); 4 | const log = require("fancy-log"); 5 | 6 | /** 7 | * Sets a global production marker that other tasks can read 8 | */ 9 | const setProductionTask = async () => { 10 | log("Setting environment to production"); 11 | current(production); 12 | }; 13 | 14 | module.exports = setProductionTask; 15 | -------------------------------------------------------------------------------- /gulp/tasks/local.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { series } = require("gulp"); 4 | 5 | const clean = require("./clean"); 6 | const styles = require("./styles"); 7 | const scripts = require("./scripts"); 8 | const copyFiles = require("./copy"); 9 | 10 | /** 11 | * Perform a local build. Similar to production, but doesn't do asset revisioning and has a different path 12 | */ 13 | module.exports = series(clean, styles, scripts, copyFiles); 14 | -------------------------------------------------------------------------------- /gulp/tasks/revisioning.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { src, dest } = require("gulp"); 4 | const rev = require("gulp-rev"); 5 | const revNapkin = require("gulp-rev-napkin"); 6 | const revCSS = require("gulp-rev-css-url"); 7 | 8 | const config = require("../config"); 9 | 10 | /** 11 | * uses gulp-rev to "append content hash to filenames: `unicorn.css` → `unicorn-d41d8cd98f.css`" 12 | * Clues the browser into the fact that a static asset has changed 13 | */ 14 | const revisioningTask = () => { 15 | return src(config.paths.revisioning, { 16 | // this is a production-only task; otherwise use gulp-environments to get the correct path 17 | base: config.paths.copy.dest.production, 18 | }) 19 | .pipe(rev()) 20 | .pipe(revCSS()) 21 | .pipe(dest(config.paths.copy.dest.production)) 22 | .pipe(revNapkin({ verbose: false })) 23 | .pipe(rev.manifest()) 24 | .pipe(dest(config.paths.manifest)); 25 | }; 26 | 27 | module.exports = revisioningTask; 28 | -------------------------------------------------------------------------------- /gulp/tasks/scripts.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { src, dest } = require("gulp"); 4 | const { production } = require("gulp-environments"); 5 | const uglify = require("gulp-uglify"); 6 | 7 | const config = require("../config"); 8 | 9 | /** 10 | * uses uglify to minify distributed JS 11 | * skipped for local builds 12 | */ 13 | const scriptsTask = () => { 14 | const destination = production() 15 | ? config.paths.js.dest.production 16 | : config.paths.js.dest.development; 17 | 18 | return ( 19 | src(config.paths.js.src) 20 | // passing uglify into the production function means uglify only runs during produciton builds 21 | .pipe(production(uglify())) 22 | .pipe(dest(destination)) 23 | ); 24 | }; 25 | 26 | module.exports = scriptsTask; 27 | -------------------------------------------------------------------------------- /gulp/tasks/styles.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { src, dest, series } = require("gulp"); 4 | const stylus = require("gulp-stylus"); 5 | const { production } = require("gulp-environments"); 6 | const concat = require("gulp-concat"); 7 | 8 | const config = require("../config"); 9 | 10 | const stylusTask = () => { 11 | const compress = production(); 12 | return src(config.paths.css.src) 13 | .pipe( 14 | stylus({ 15 | compress, 16 | }) 17 | ) 18 | .pipe(dest(config.paths.temp)); 19 | }; 20 | 21 | const tasks = [stylusTask]; 22 | 23 | for (const key in config.paths.css.bundles) { 24 | const func = () => { 25 | const destination = production() 26 | ? config.paths.css.dest.production 27 | : config.paths.css.dest.development; 28 | 29 | return src(config.paths.css.bundles[key]) 30 | .pipe(concat(`${key}.css`)) 31 | .pipe(dest(destination)); 32 | }; 33 | // give the dynamic task a custom name for debugging 34 | Object.defineProperty(func, "name", { 35 | value: `styles:${key}`, 36 | writable: false, 37 | }); 38 | 39 | tasks.push(func); 40 | } 41 | 42 | /** 43 | * compiles CSS using stylus 44 | */ 45 | module.exports = series(...tasks); 46 | -------------------------------------------------------------------------------- /gulp/tasks/watch.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const { watch, series } = require("gulp"); 4 | const config = require("../config"); 5 | 6 | const clean = require("./clean"); 7 | const styles = require("./styles"); 8 | const scripts = require("./scripts"); 9 | const copyFiles = require("./copy"); 10 | 11 | const watchPaths = async () => { 12 | watch(config.paths.css.src, styles); 13 | watch(config.paths.js.src, scripts); 14 | watch(config.paths.copy.src, copyFiles); 15 | }; 16 | 17 | /** 18 | * watches js and CSS for filesystem changes 19 | */ 20 | const watchTask = series(clean, styles, scripts, copyFiles, watchPaths); 21 | 22 | module.exports = watchTask; 23 | -------------------------------------------------------------------------------- /gulpfile.js: -------------------------------------------------------------------------------- 1 | const build = require("./gulp/tasks/build"); 2 | const watch = require("./gulp/tasks/watch"); 3 | const local = require("./gulp/tasks/local"); 4 | const clean = require("./gulp/tasks/clean"); 5 | 6 | module.exports = { 7 | build, 8 | watch, 9 | local, 10 | clean, 11 | default: watch, 12 | }; 13 | -------------------------------------------------------------------------------- /jobboard/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/jobboard/__init__.py -------------------------------------------------------------------------------- /jobboard/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import Job 4 | 5 | 6 | @admin.register(Job) 7 | class JobAdmin(admin.ModelAdmin): 8 | list_display = ("role", "company", "location", "remuneration", "open", "date_created") 9 | search_fields = ("company", "role") 10 | list_filter = ("open", "company", "location", "date_created") 11 | -------------------------------------------------------------------------------- /jobboard/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class JobboardConfig(AppConfig): 5 | default_auto_field = "django.db.models.BigAutoField" 6 | name = "jobboard" 7 | -------------------------------------------------------------------------------- /jobboard/forms.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/jobboard/forms.py -------------------------------------------------------------------------------- /jobboard/migrations/0002_auto_20230202_1131.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.16 on 2023-02-02 11:31 2 | 3 | import django.db.models.deletion 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | dependencies = [ 9 | ("globalpartners", "0001_initial"), 10 | ("jobboard", "0001_initial"), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name="job", 16 | name="company", 17 | field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to="globalpartners.globalpartner"), 18 | ), 19 | migrations.DeleteModel( 20 | name="Company", 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /jobboard/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/jobboard/migrations/__init__.py -------------------------------------------------------------------------------- /jobboard/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from tinymce import models as tinymce_models 3 | 4 | from globalpartners.models import GlobalPartner 5 | 6 | 7 | class Job(models.Model): 8 | company = models.ForeignKey(GlobalPartner, on_delete=models.CASCADE) 9 | role = models.CharField(max_length=200) 10 | location = models.CharField(max_length=200) 11 | summary = models.TextField(max_length=300) 12 | description = tinymce_models.HTMLField() 13 | open = models.BooleanField(default=True) 14 | remuneration = models.CharField(max_length=50, blank=True, null=True) 15 | apply = models.URLField() 16 | date_created = models.DateTimeField(auto_now_add=True) 17 | 18 | def __str__(self): 19 | return f"{self.company} - {self.role}" 20 | -------------------------------------------------------------------------------- /jobboard/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | app_name = "jobboard" 6 | 7 | 8 | urlpatterns = [ 9 | path("", views.index, name="index"), 10 | path("job//", views.job_detail, name="job_detail"), 11 | ] 12 | -------------------------------------------------------------------------------- /jobboard/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | from .models import Job 4 | 5 | 6 | def index(request): 7 | job_list = Job.objects.filter(open=True).order_by("-date_created") 8 | return render(request, "jobboard/index.html", {"job_list": job_list}) 9 | 10 | 11 | def job_detail(request, id): 12 | try: 13 | job = Job.objects.get(id=id) 14 | except Job.DoesNotExist: 15 | job = None 16 | 17 | return render(request, "jobboard/job.html", {"job": job}) 18 | -------------------------------------------------------------------------------- /locale/es/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/locale/es/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /locale/fr/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/locale/fr/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | from dotenv import find_dotenv, load_dotenv 6 | from work.django_init import Init 7 | 8 | load_dotenv(find_dotenv(filename=".environment")) 9 | 10 | 11 | if __name__ == "__main__": 12 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "djangogirls.settings") 13 | Init.run() 14 | 15 | from django.core.management import execute_from_command_line 16 | 17 | if os.environ.get("CLEAN_PYC") == "TRUE" and "clean_pyc" not in sys.argv: 18 | # sys.stdout.write('\nCleaning .pyc files...') 19 | proj, _ = os.path.split(__file__) 20 | cmd = "find '{d}' -name '*.pyc' -delete".format(d=proj or ".") 21 | os.system(cmd) 22 | # sys.stdout.write('done\n\n') 23 | 24 | execute_from_command_line(sys.argv) 25 | -------------------------------------------------------------------------------- /organize/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/organize/__init__.py -------------------------------------------------------------------------------- /organize/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class OrganizeConfig(AppConfig): 5 | name = "organize" 6 | -------------------------------------------------------------------------------- /organize/constants.py: -------------------------------------------------------------------------------- 1 | from django.utils.translation import gettext_lazy as _ 2 | 3 | INVOLVEMENT_CHOICES = ( 4 | ("newcomer", _("I've never been to a Django Girls event")), 5 | ("attendee", _("I'm a former attendee")), 6 | ("coach", _("I'm a former coach")), 7 | ("organizer", _("I'm a former organizer")), 8 | ("contributor", _("I contributed to the tutorial or translations")), 9 | ) 10 | 11 | 12 | NEW = "new" # event is freshly submitted by user 13 | IN_REVIEW = "in_review" # admin started triaging the event 14 | ON_HOLD = "on_hold" # event is temporarily on hold (i.e. date is not definite) 15 | ACCEPTED = "accepted" 16 | REJECTED = "rejected" 17 | DEPLOYED = "deployed" 18 | 19 | APPLICATION_STATUS = ( 20 | (NEW, _("New")), 21 | (IN_REVIEW, _("In review")), 22 | (ON_HOLD, _("On hold")), 23 | (ACCEPTED, _("Accepted")), 24 | (REJECTED, _("Rejected")), 25 | (DEPLOYED, _("Deployed")), 26 | ) 27 | -------------------------------------------------------------------------------- /organize/managers.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.utils import timezone 3 | 4 | 5 | class EventApplicationQuerySet(models.QuerySet): 6 | def change_status_to(self, status): 7 | """Same signature as EventApplication.change_status_to""" 8 | self.update(status=status, status_changed_at=timezone.now()) 9 | -------------------------------------------------------------------------------- /organize/migrations/0002_auto_20171217_1144.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0 on 2017-12-17 11:44 2 | 3 | import django.db.models.deletion 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | dependencies = [ 9 | ("organize", "0001_initial"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name="eventapplication", 15 | name="previous_event", 16 | field=models.ForeignKey( 17 | blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="core.Event" 18 | ), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /organize/migrations/0004_auto_20201028_1923.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.12 on 2020-10-28 19:23 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("organize", "0003_auto_20190727_2013"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="eventapplication", 14 | name="remote", 15 | field=models.BooleanField(default=False), 16 | ), 17 | migrations.AddField( 18 | model_name="eventapplication", 19 | name="safety", 20 | field=models.TextField( 21 | blank=True, 22 | verbose_name="Information about how you will ensure participants' and coaches' safety during the Covid-19 pandemic", 23 | ), 24 | ), 25 | migrations.AddField( 26 | model_name="eventapplication", 27 | name="tools", 28 | field=models.TextField(blank=True, verbose_name="Information about how you will host your remote workshop"), 29 | ), 30 | migrations.AlterField( 31 | model_name="eventapplication", 32 | name="venue", 33 | field=models.TextField(blank=True, verbose_name="Information about your potential venue"), 34 | ), 35 | ] 36 | -------------------------------------------------------------------------------- /organize/migrations/0005_eventapplication_additional.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.12 on 2020-10-30 13:20 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("organize", "0004_auto_20201028_1923"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="eventapplication", 14 | name="additional", 15 | field=models.TextField( 16 | blank=True, verbose_name="Any additional information you think may help your application" 17 | ), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /organize/migrations/0006_eventapplication_diversity.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0.12 on 2021-01-18 23:46 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("organize", "0005_eventapplication_additional"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="eventapplication", 14 | name="diversity", 15 | field=models.TextField( 16 | default="", 17 | verbose_name="Information about how you intend to ensure your workshop is inclusive and promotes diversity", 18 | ), 19 | preserve_default=False, 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /organize/migrations/0008_eventapplication_local_restrictions.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2022-03-02 13:22 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("organize", "0007_auto_20210906_1216"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="eventapplication", 14 | name="local_restrictions", 15 | field=models.TextField( 16 | blank=True, 17 | verbose_name="Information about local restrictions for physical restrictions due to Covid-19 pandemic.", 18 | ), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /organize/migrations/0009_eventapplication_confirm_covid_19_protocols.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2022-03-02 13:40 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("organize", "0008_eventapplication_local_restrictions"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AddField( 13 | model_name="eventapplication", 14 | name="confirm_covid_19_protocols", 15 | field=models.BooleanField( 16 | default=False, 17 | verbose_name="Confirmation that you will postpone or have a remote event if your government regulations for Covid-19 change.", 18 | ), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /organize/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/organize/migrations/__init__.py -------------------------------------------------------------------------------- /organize/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from . import views 4 | 5 | app_name = "organize" 6 | urlpatterns = [ 7 | path("", views.index, name="index"), 8 | path("prerequisites/", views.prerequisites, name="prerequisites"), 9 | path("commitment/", views.commitment, name="commitment"), 10 | path("form/thank_you/", views.form_thank_you, name="form_thank_you"), 11 | path("form//", views.organize_form_wizard, name="form_step"), 12 | # path('remote_or_in_person/', views.remote_or_in_person, name='remote_or_in_person'), 13 | path("suspend/", views.suspend, name="suspend"), 14 | ] 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "djangogirls", 3 | "private": true, 4 | "version": "1.0.0", 5 | "description": "This repository contains sources of Django application that powers [DjangoGirls.org](http://djangogirls.org/).", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/DjangoGirls/djangogirls.git" 9 | }, 10 | "bugs": { 11 | "url": "https://github.com/DjangoGirls/djangogirls/issues" 12 | }, 13 | "homepage": "https://github.com/DjangoGirls/djangogirls#readme", 14 | "devDependencies": { 15 | "bootstrap": "^3.3.6", 16 | "del": "^6.0.0", 17 | "fancy-log": "^1.3.3", 18 | "gulp": "^4.0.2", 19 | "gulp-concat": "^2.6.0", 20 | "gulp-environments": "0.1.3", 21 | "gulp-rev": "^7.0.0", 22 | "gulp-rev-css-url": "0.1.0", 23 | "gulp-rev-napkin": "0.1.0", 24 | "gulp-stylus": "^2.3.1", 25 | "gulp-uglify": "^1.5.3", 26 | "gulp-watch": "^4.3.5", 27 | "stylus": "^0.59.0" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /patreonmanager/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/patreonmanager/__init__.py -------------------------------------------------------------------------------- /patreonmanager/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | from django.utils.translation import gettext_lazy as _ 3 | 4 | 5 | class PatreonManagerConfig(AppConfig): 6 | name = "patreonmanager" 7 | verbose_name = _("Patreon Manager") 8 | -------------------------------------------------------------------------------- /patreonmanager/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/patreonmanager/management/__init__.py -------------------------------------------------------------------------------- /patreonmanager/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/patreonmanager/management/commands/__init__.py -------------------------------------------------------------------------------- /patreonmanager/management/commands/download_csv.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from getpass import getpass 3 | from os import path 4 | 5 | from django.core.management.base import BaseCommand 6 | 7 | from ...utils.download import _download, gen_monthly_report_links, login 8 | 9 | 10 | class Command(BaseCommand): 11 | help = "Download your monthly patron reports from Patreon (CSV)." 12 | 13 | def add_arguments(self, parser): 14 | parser.add_argument("-u", "--username", help="Patreon username") 15 | parser.add_argument("-p", "--password", help="Patreon password") 16 | parser.add_argument("-d", "--directory", help="save CSV reports to DIRECTORY", default=".") 17 | 18 | def handle(self, *args, **options): 19 | if not options["username"]: 20 | options["username"] = input("Patreon username: ") 21 | if not options["password"]: 22 | options["password"] = getpass("Patreon password (will be hidden): ") 23 | 24 | if options["verbosity"] > 0: 25 | logging.basicConfig(level=logging.INFO) 26 | 27 | session = login(options["username"], options["password"]) 28 | 29 | for filename, url in gen_monthly_report_links(session): 30 | _download(session, url, path.join(options["directory"], filename)) 31 | -------------------------------------------------------------------------------- /patreonmanager/management/commands/fundraising_status.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | import requests 4 | from django.conf import settings 5 | from django.core.management.base import BaseCommand 6 | from slack_sdk.errors import SlackApiError 7 | 8 | from core.slack_client import post_message_to_slack 9 | from patreonmanager.models import FundraisingStatus 10 | 11 | DJANGOGIRLS_USER_ID = 483065 12 | BASE_API_URL = "https://api.patreon.com/" 13 | 14 | 15 | class Command(BaseCommand): 16 | help = "Fetch current amount of money raised on our Patreon" 17 | 18 | def handle(self, *args, **options): 19 | logging.basicConfig(level=logging.INFO) 20 | 21 | logging.info("Trying to fetch data from Patreon...") 22 | url = f"{BASE_API_URL}user/{DJANGOGIRLS_USER_ID}" 23 | request = requests.get(url) 24 | data = request.json() 25 | 26 | patron_count = data["linked"][0]["patron_count"] 27 | pledge_sum = int(int(data["linked"][0]["pledge_sum"]) / 100) 28 | message = f"Daily Patreon update: {patron_count} patrons pledged ${pledge_sum} monthly!" 29 | logging.info(message) 30 | 31 | stats = FundraisingStatus(number_of_patrons=patron_count, amount_raised=pledge_sum) 32 | stats.save() 33 | logging.info("Stats saved.") 34 | 35 | if settings.ENABLE_SLACK_NOTIFICATIONS: 36 | try: 37 | post_message_to_slack("#notifications", message) 38 | except SlackApiError: 39 | logging.exception("[Daily Patreon Update] Slack message not sent.") 40 | -------------------------------------------------------------------------------- /patreonmanager/management/commands/listpatrons.py: -------------------------------------------------------------------------------- 1 | from collections import Counter 2 | 3 | from django.core.management.base import BaseCommand 4 | 5 | from ...models import Payment 6 | 7 | 8 | class Command(BaseCommand): 9 | help = "List Patrons who need a reward to be sent to them" 10 | 11 | def handle(self, *args, **options): 12 | payments = Payment.objects.filter( 13 | status=Payment.STATUS.PROCESSED, 14 | completed=False, 15 | reward__value__gte=10, 16 | ) 17 | 18 | c = Counter(payment.patron for payment in payments.select_related("patron")) 19 | 20 | for patron, count in c.most_common(): 21 | self.stdout.write( 22 | "%s: %d month%s in a row" 23 | % ( 24 | patron.name, 25 | count, 26 | "s" if count > 1 else "", # plural mark 27 | ) 28 | ) 29 | -------------------------------------------------------------------------------- /patreonmanager/migrations/0002_auto_20171217_1144.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.0 on 2017-12-17 11:44 2 | 3 | import django.db.models.deletion 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | dependencies = [ 9 | ("patreonmanager", "0001_initial"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name="payment", 15 | name="patron", 16 | field=models.ForeignKey( 17 | on_delete=django.db.models.deletion.PROTECT, 18 | related_name="payments", 19 | to="patreonmanager.Patron", 20 | verbose_name="patron", 21 | ), 22 | ), 23 | migrations.AlterField( 24 | model_name="payment", 25 | name="reward", 26 | field=models.ForeignKey( 27 | on_delete=django.db.models.deletion.PROTECT, 28 | related_name="+", 29 | to="patreonmanager.Reward", 30 | verbose_name="reward", 31 | ), 32 | ), 33 | ] 34 | -------------------------------------------------------------------------------- /patreonmanager/migrations/0003_auto_20210906_0915.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-09-06 09:15 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("patreonmanager", "0002_auto_20171217_1144"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="fundraisingstatus", 14 | name="id", 15 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"), 16 | ), 17 | migrations.AlterField( 18 | model_name="patron", 19 | name="id", 20 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"), 21 | ), 22 | migrations.AlterField( 23 | model_name="payment", 24 | name="id", 25 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"), 26 | ), 27 | migrations.AlterField( 28 | model_name="reward", 29 | name="id", 30 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"), 31 | ), 32 | ] 33 | -------------------------------------------------------------------------------- /patreonmanager/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/patreonmanager/migrations/__init__.py -------------------------------------------------------------------------------- /patreonmanager/templates/admin/patreonmanager/patron/change_form.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/change_form.html" %} 2 | 3 | {% load i18n %} 4 | 5 | {% block object-tools-items %} 6 | {{ block.super }} 7 |
  • 8 | 9 | {% blocktrans count counter=original.payments.count %} 10 | {{ counter }} payment 11 | {% plural %} 12 | {{ counter }} payments 13 | {% endblocktrans %} 14 | 15 |
  • 16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /patreonmanager/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/patreonmanager/utils/__init__.py -------------------------------------------------------------------------------- /pictures/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/pictures/__init__.py -------------------------------------------------------------------------------- /pictures/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from .models import StockPicture 4 | 5 | 6 | @admin.register(StockPicture) 7 | class StockPictureAdmin(admin.ModelAdmin): 8 | list_display = ("photo", "kind") 9 | -------------------------------------------------------------------------------- /pictures/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PicturesConfig(AppConfig): 5 | name = "pictures" 6 | -------------------------------------------------------------------------------- /pictures/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 1.11.5 on 2017-12-16 21:24 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | initial = True 8 | 9 | dependencies = [] 10 | 11 | operations = [ 12 | migrations.CreateModel( 13 | name="StockPicture", 14 | fields=[ 15 | ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), 16 | ("photo", models.ImageField(upload_to="stock_pictures/")), 17 | ( 18 | "photo_credit", 19 | models.CharField( 20 | help_text="Only use pictures with a Creative Commons license.", 21 | max_length=200, 22 | ), 23 | ), 24 | ("photo_link", models.URLField(verbose_name="photo URL")), 25 | ( 26 | "kind", 27 | models.CharField( 28 | choices=[("CO", "Event cover (356 x 210px)"), ("BA", "Section background")], max_length=2 29 | ), 30 | ), 31 | ], 32 | ), 33 | ] 34 | -------------------------------------------------------------------------------- /pictures/migrations/0002_alter_stockpicture_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-09-06 09:15 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("pictures", "0001_initial"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="stockpicture", 14 | name="id", 15 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /pictures/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/pictures/migrations/__init__.py -------------------------------------------------------------------------------- /pictures/models.py: -------------------------------------------------------------------------------- 1 | import random 2 | 3 | from django.db import models 4 | from django.utils.functional import lazy 5 | from django.utils.safestring import mark_safe 6 | from django.utils.translation import gettext_lazy as _ 7 | 8 | mark_safe_lazy = lazy(mark_safe, str) 9 | 10 | 11 | class EventPictureManager(models.Manager): 12 | def random_cover(self): 13 | queryset = self.get_queryset() 14 | return random.choice(queryset.filter(kind=StockPicture.COVER)) 15 | 16 | def random_background(self): 17 | queryset = self.get_queryset() 18 | return random.choice(queryset.filter(kind=StockPicture.BACKGROUND)) 19 | 20 | 21 | class StockPicture(models.Model): 22 | COVER = "CO" 23 | BACKGROUND = "BA" 24 | KIND_CHOICES = ( 25 | (COVER, _("Event cover (356 x 210px)")), 26 | (BACKGROUND, _("Section background")), 27 | ) 28 | 29 | photo = models.ImageField(upload_to="stock_pictures/") 30 | photo_credit = models.CharField( 31 | max_length=200, 32 | help_text=mark_safe_lazy( 33 | _( 34 | "Only use pictures with a " 35 | "Creative Commons license." 36 | ) 37 | ), 38 | ) 39 | photo_link = models.URLField(_("photo URL")) 40 | kind = models.CharField(max_length=2, choices=KIND_CHOICES) 41 | 42 | objects = EventPictureManager() 43 | 44 | def __str__(self): 45 | return self.photo.name 46 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.black] 2 | line-length = 120 3 | target-version = ["py310"] 4 | 5 | [tool.isort] 6 | multi_line_output = 3 7 | include_trailing_comma = true 8 | force_grid_wrap = 0 9 | use_parentheses = true 10 | ensure_newline_before_comments = true 11 | line_length = 120 12 | skip = [ 13 | ".git", 14 | ".venv", 15 | ".github", 16 | "mediafiles", 17 | "static", 18 | "templates", 19 | "locale", 20 | "gulp", 21 | "node_modules", 22 | ] 23 | -------------------------------------------------------------------------------- /pytest.ini: -------------------------------------------------------------------------------- 1 | [pytest] 2 | DJANGO_SETTINGS_MODULE=djangogirls.settings 3 | addopts = --ff --nomigrations 4 | env = 5 | RECAPTCHA_TESTING=True 6 | env_files = 7 | .environment 8 | -------------------------------------------------------------------------------- /requirements.in: -------------------------------------------------------------------------------- 1 | # Core dependencies 2 | dj-database-url==0.5.0 3 | django-admin-sortable2==1.0.4 4 | django-autoslug==1.9.4 5 | django-bleach<4 6 | django-click==2.3.0 7 | django-countries 8 | django-date-extensions 9 | django-debug-toolbar 10 | django-extensions 11 | django-formtools==2.3.0 12 | django-gulp-rev==0.2 13 | django-leaflet==0.24.0 14 | django-markdown-deux==1.0.5 15 | django-recaptcha 16 | django-sendgrid-v5==0.8.1 17 | django-storages[boto3]==1.7.1 18 | django-tinymce 19 | django-unused-media==0.1.13 20 | django>=3.2,<4 21 | dnspython 22 | easy-thumbnails 23 | easydict==1.10 24 | pillow==9.3.0 25 | psycopg2-binary==2.8.3 26 | pyquery==1.4.0 27 | urlextract 28 | 29 | # Local development 30 | python-dotenv==0.21.0 31 | pip-tools==6.12.1 32 | pre-commit==2.21.0 33 | 34 | # Linting / Formatting 35 | autoflake==1.4 36 | black==22.3.0 37 | flake8==4.0.1 38 | isort==5.8.0 39 | 40 | # Testing 41 | freezegun 42 | pytest-cov==2.12.1 43 | pytest-django==4.4.0 44 | pytest-dotenv==0.5.2 45 | pytest-env==0.6.2 46 | pytest-mock==3.10.0 47 | pytest==6.2.5 48 | vcrpy 49 | 50 | # Integrations 51 | django-gulp-rev==0.2 52 | django-leaflet==0.24.0 53 | django-sendgrid-v5==0.8.1 54 | google-api-python-client==2.37.0 55 | icalendar==4.0.3 56 | oauth2client==4.1.3 57 | py-trello==0.13.0 58 | sentry-sdk 59 | slack_sdk==3.19.5 60 | stripe 61 | -------------------------------------------------------------------------------- /rootfs/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -e 2 | 3 | echo "Applying database migrations" 4 | ./manage.py migrate 5 | 6 | echo "Starting application" 7 | ./manage.py runserver 0.0.0.0:8000 8 | -------------------------------------------------------------------------------- /rootfs/healthcheck.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh -e 2 | 3 | curl --fail -L http://localhost:8000/ 4 | -------------------------------------------------------------------------------- /sponsor/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/sponsor/__init__.py -------------------------------------------------------------------------------- /sponsor/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from core.models import EventPageContent 4 | 5 | from .models import Donor, Sponsor 6 | 7 | 8 | class SponsorInline(admin.TabularInline): 9 | model = EventPageContent.sponsors.through 10 | extra = 1 11 | verbose_name_plural = "Sponsors" 12 | 13 | 14 | @admin.register(Sponsor) 15 | class SponsorAdmin(admin.ModelAdmin): 16 | list_display = ("id", "name", "logo_display_for_admin", "url") 17 | list_per_page = 50 18 | search_fields = ("name",) 19 | 20 | def get_queryset(self, request): 21 | qs = super().get_queryset(request) 22 | if request.user.is_superuser: 23 | return qs 24 | return qs.filter(eventpagecontent__event__team=request.user).distinct() 25 | 26 | def get_form(self, request, obj=None, **kwargs): 27 | form = super().get_form(request, obj, **kwargs) 28 | if not request.user.is_superuser: 29 | if "eventpagecontent" in form.base_fields: 30 | qs = EventPageContent.objects.filter(event__team=request.user) 31 | form.base_fields["eventpagecontent"].queryset = qs 32 | return form 33 | 34 | 35 | admin.site.register(Donor) 36 | -------------------------------------------------------------------------------- /sponsor/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class SponsorConfig(AppConfig): 5 | name = "sponsor" 6 | -------------------------------------------------------------------------------- /sponsor/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 1.11.5 on 2017-12-16 21:24 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | initial = True 8 | 9 | dependencies = [] 10 | 11 | operations = [ 12 | migrations.CreateModel( 13 | name="Sponsor", 14 | fields=[ 15 | ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), 16 | ("name", models.CharField(blank=True, max_length=200, null=True)), 17 | ( 18 | "logo", 19 | models.ImageField( 20 | blank=True, 21 | help_text="Make sure logo is not bigger than 200 pixels wide", 22 | null=True, 23 | upload_to="event/sponsors/", 24 | ), 25 | ), 26 | ("url", models.URLField(blank=True, null=True)), 27 | ("description", models.TextField(blank=True, null=True)), 28 | ], 29 | options={ 30 | "ordering": ("name",), 31 | }, 32 | ), 33 | ] 34 | -------------------------------------------------------------------------------- /sponsor/migrations/0002_donor.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 1.11.7 on 2018-06-26 10:05 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("sponsor", "0001_initial"), 9 | ] 10 | 11 | operations = [ 12 | migrations.CreateModel( 13 | name="Donor", 14 | fields=[ 15 | ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), 16 | ("name", models.CharField(blank=True, max_length=200, null=True)), 17 | ("amount", models.FloatField()), 18 | ("visible", models.BooleanField(default=False)), 19 | ], 20 | options={ 21 | "ordering": ("amount",), 22 | }, 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /sponsor/migrations/0003_auto_20210906_0915.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-09-06 09:15 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("sponsor", "0002_donor"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="donor", 14 | name="id", 15 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"), 16 | ), 17 | migrations.AlterField( 18 | model_name="sponsor", 19 | name="id", 20 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"), 21 | ), 22 | ] 23 | -------------------------------------------------------------------------------- /sponsor/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/sponsor/migrations/__init__.py -------------------------------------------------------------------------------- /sponsor/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.utils.translation import gettext_lazy as _ 3 | 4 | 5 | class Sponsor(models.Model): 6 | name = models.CharField(max_length=200, null=True, blank=True) 7 | logo = models.ImageField( 8 | upload_to="event/sponsors/", 9 | null=True, 10 | blank=True, 11 | help_text=_("Make sure logo is not bigger than 200 pixels wide"), 12 | ) 13 | url = models.URLField(null=True, blank=True) 14 | description = models.TextField(null=True, blank=True) 15 | 16 | def __str__(self): 17 | return self.name 18 | 19 | class Meta: 20 | ordering = ("name",) 21 | 22 | def logo_display_for_admin(self): 23 | if self.logo: 24 | return f'' 25 | else: 26 | return _("No logo") 27 | 28 | logo_display_for_admin.allow_tags = True 29 | 30 | 31 | class Donor(models.Model): 32 | name = models.CharField(max_length=200, null=True, blank=True) 33 | amount = models.FloatField() 34 | visible = models.BooleanField(default=False) 35 | 36 | def __str__(self): 37 | return self.name 38 | 39 | class Meta: 40 | ordering = ("amount",) 41 | -------------------------------------------------------------------------------- /sponsor/urls.py: -------------------------------------------------------------------------------- 1 | # from django.urls import path 2 | # from django.contrib.auth.decorators import login_required 3 | # 4 | # from sponsor.views import SponsorRequestView 5 | # 6 | # app_name = 'sponsor' 7 | # urlpatterns = [ 8 | # path( 9 | # 'sponsor-request/', login_required(SponsorRequestView.as_view()), 10 | # name='sponsor-request' 11 | # ), 12 | # ] 13 | -------------------------------------------------------------------------------- /sponsor/views.py: -------------------------------------------------------------------------------- 1 | # from django.views.generic.base import TemplateView 2 | # 3 | # from core.utils import next_deadline 4 | # 5 | # 6 | # class SponsorRequestView(TemplateView): 7 | # template_name = "sponsor/sponsor-request.html" 8 | # 9 | # def get_context_data(self, **kwargs): 10 | # context = super(SponsorRequestView, self).get_context_data(**kwargs) 11 | # context["deadline"] = next_deadline() 12 | # return context 13 | -------------------------------------------------------------------------------- /static/source/css/admin.styl: -------------------------------------------------------------------------------- 1 | // Make sure there is enough space for the fixed-width CodeMirror editor. 2 | .core-eventpagecontent 3 | min-width: 1351px 4 | 5 | .save-box 6 | a.btn 7 | align-items: flex-start 8 | box-sizing: border-box 9 | line-height: 30px 10 | -------------------------------------------------------------------------------- /static/source/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/favicon.ico -------------------------------------------------------------------------------- /static/source/img/global/coach-empty.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/coach-empty.jpg -------------------------------------------------------------------------------- /static/source/img/global/contribute/coach.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/contribute/coach.jpg -------------------------------------------------------------------------------- /static/source/img/global/contribute/debug.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/contribute/debug.jpg -------------------------------------------------------------------------------- /static/source/img/global/contribute/gitter.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/contribute/gitter.jpg -------------------------------------------------------------------------------- /static/source/img/global/contribute/love.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/contribute/love.jpg -------------------------------------------------------------------------------- /static/source/img/global/contribute/more.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/contribute/more.jpg -------------------------------------------------------------------------------- /static/source/img/global/contribute/organize.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/contribute/organize.jpg -------------------------------------------------------------------------------- /static/source/img/global/contribute/translate.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/contribute/translate.jpg -------------------------------------------------------------------------------- /static/source/img/global/contribute/tutoedit.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/contribute/tutoedit.jpg -------------------------------------------------------------------------------- /static/source/img/global/django.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/django.png -------------------------------------------------------------------------------- /static/source/img/global/donate/django_crowdfunding_heart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/donate/django_crowdfunding_heart.png -------------------------------------------------------------------------------- /static/source/img/global/donate/ghana.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/donate/ghana.png -------------------------------------------------------------------------------- /static/source/img/global/donate/lagos.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/donate/lagos.jpg -------------------------------------------------------------------------------- /static/source/img/global/donate/tshirt.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/donate/tshirt.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture01.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture02.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture03.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture04.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture04.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture05.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture05.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture06.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture06.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture07.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture07.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture08.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture10.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture11.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture12.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture13.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture14.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture15.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture16.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture17.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture17.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture18.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture18.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture19.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture19.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture20.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture20.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture21.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture21.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture22.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture23.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture23.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture24.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture24.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture25.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture25.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture26.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture26.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture27.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture27.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture28.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture28.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture29.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture29.jpg -------------------------------------------------------------------------------- /static/source/img/global/eventslist/picture30.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/eventslist/picture30.jpg -------------------------------------------------------------------------------- /static/source/img/global/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/logo.png -------------------------------------------------------------------------------- /static/source/img/global/mainphoto-04122015.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/mainphoto-04122015.jpg -------------------------------------------------------------------------------- /static/source/img/global/mainphoto.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/mainphoto.jpg -------------------------------------------------------------------------------- /static/source/img/global/map_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/map_icon.png -------------------------------------------------------------------------------- /static/source/img/global/resources/coach.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/resources/coach.jpg -------------------------------------------------------------------------------- /static/source/img/global/resources/extensions.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/resources/extensions.jpg -------------------------------------------------------------------------------- /static/source/img/global/resources/organize.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/resources/organize.jpg -------------------------------------------------------------------------------- /static/source/img/global/resources/tutorial.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/resources/tutorial.jpg -------------------------------------------------------------------------------- /static/source/img/global/supporters/JamBonSW.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/JamBonSW.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/britecore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/britecore.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/caktus-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/caktus-logo.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/developeo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/developeo.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/divio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/divio.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/django.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/django.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/djangostars.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/djangostars.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/elastic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/elastic.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/eventbrite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/eventbrite.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/flatirons.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/flatirons.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/github.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/jetbrains.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/jetbrains.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/lincolnloop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/lincolnloop.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/linode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/linode.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/mailchimp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/mailchimp.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/micropyramid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/micropyramid.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/nexmo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/nexmo.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/niteo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/niteo.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/oddlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/oddlogo.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/opendataservices.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/opendataservices.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/posthog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/posthog.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/potato.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/potato.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/pythonanywhere.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/pythonanywhere.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/pythonsoftwarefoundation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/pythonsoftwarefoundation.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/readthedocs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/readthedocs.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/rmotr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/rmotr.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/runcode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/runcode.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/runcode_io.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/runcode_io.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/sentry.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/sentry.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/sherpany.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/sherpany.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/sixfeetup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/sixfeetup.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/taiga.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/taiga.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/techdomains.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/techdomains.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/torchbox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/torchbox.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/webucator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/webucator.png -------------------------------------------------------------------------------- /static/source/img/global/supporters/wsp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/supporters/wsp.png -------------------------------------------------------------------------------- /static/source/img/global/tiwapll.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/tiwapll.jpg -------------------------------------------------------------------------------- /static/source/img/global/tshirt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/tshirt.png -------------------------------------------------------------------------------- /static/source/img/global/woman.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/global/woman.jpg -------------------------------------------------------------------------------- /static/source/img/logo-bigger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/logo-bigger.png -------------------------------------------------------------------------------- /static/source/img/logo-negative.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/logo-negative.png -------------------------------------------------------------------------------- /static/source/img/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/logo.png -------------------------------------------------------------------------------- /static/source/img/mapbox-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/mapbox-icon.png -------------------------------------------------------------------------------- /static/source/img/photos/about1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/photos/about1.jpg -------------------------------------------------------------------------------- /static/source/img/photos/about2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/photos/about2.jpg -------------------------------------------------------------------------------- /static/source/img/photos/apply.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/photos/apply.jpg -------------------------------------------------------------------------------- /static/source/img/photos/coach1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/photos/coach1.jpg -------------------------------------------------------------------------------- /static/source/img/photos/coach2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/photos/coach2.jpg -------------------------------------------------------------------------------- /static/source/img/photos/footer1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/photos/footer1.jpg -------------------------------------------------------------------------------- /static/source/img/photos/footer2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/photos/footer2.jpg -------------------------------------------------------------------------------- /static/source/img/photos/organize-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/photos/organize-1.jpg -------------------------------------------------------------------------------- /static/source/img/photos/organize-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/photos/organize-2.jpg -------------------------------------------------------------------------------- /static/source/img/photos/organize-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/photos/organize-3.jpg -------------------------------------------------------------------------------- /static/source/img/report-2015/agata.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/report-2015/agata.jpg -------------------------------------------------------------------------------- /static/source/img/report-2015/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/report-2015/github.png -------------------------------------------------------------------------------- /static/source/img/report-2015/hello.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/report-2015/hello.jpg -------------------------------------------------------------------------------- /static/source/img/report-2015/maria.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/report-2015/maria.jpg -------------------------------------------------------------------------------- /static/source/img/report-2015/paivi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/report-2015/paivi.jpg -------------------------------------------------------------------------------- /static/source/img/report-2015/patreon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/report-2015/patreon.png -------------------------------------------------------------------------------- /static/source/img/report-2015/python.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/report-2015/python.png -------------------------------------------------------------------------------- /static/source/img/report-2015/report.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/img/report-2015/report.jpg -------------------------------------------------------------------------------- /static/source/js/event.js: -------------------------------------------------------------------------------- 1 | 2 | $(document).ready(function() { 3 | 4 | $('a[href*=#]').each(function() { 5 |     if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') 6 |     && location.hostname == this.hostname 7 |     && this.hash.replace(/#/,'') ) { 8 |       var $targetId = $(this.hash), $targetAnchor = $('[name=' + this.hash.slice(1) +']'); 9 |       var $target = $targetId.length ? $targetId : $targetAnchor.length ? $targetAnchor : false; 10 |        if ($target) { 11 |          var targetOffset = $target.offset().top - 50; 12 | 13 | 14 |          $(this).click(function() { 15 | 16 |            $('html, body').animate({scrollTop: targetOffset}, 1000); 17 |            return false; 18 |          }); 19 |       } 20 |     } 21 | }); 22 | 23 | }); 24 | -------------------------------------------------------------------------------- /static/source/js/global.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function() { 2 | 3 | $('.gallery').sss({ 4 | showNav: false 5 | }); 6 | 7 | function imitate_link(element) { 8 | var url = $(element).attr('rel'); 9 | if (url != undefined) window.location = url; 10 | } 11 | 12 | $('.event .credit').click(function() { 13 | imitate_link(this); 14 | return false; 15 | }); 16 | 17 | $('.event .credit span').click(function() { 18 | imitate_link(this); 19 | return false; 20 | }); 21 | 22 | $('.show-more a').click(function(){ 23 | $('.upcoming-events .row-container').css('max-height', '100%'); 24 | $('.upcoming-events .row-container').css('overflow', 'visible'); 25 | $('.show-more').css('display', 'none'); 26 | }); 27 | }); 28 | -------------------------------------------------------------------------------- /static/source/vendor/css/sss.css: -------------------------------------------------------------------------------- 1 | .sss { 2 | height: 0; 3 | margin: 0; 4 | padding: 0; 5 | position: relative; 6 | display: block; 7 | overflow: hidden; 8 | text-align: center; 9 | } 10 | 11 | .ssslide { 12 | margin: 0; 13 | padding: 0; 14 | position: absolute; 15 | top: 0; 16 | left: 0; 17 | display: none; 18 | overflow: hidden; 19 | } 20 | 21 | .ssslide img { 22 | max-width: 100%; 23 | width: auto; 24 | height: auto; 25 | margin: 0; 26 | padding: 0; 27 | position: relative; 28 | display: block; 29 | } 30 | 31 | .sssnext, .sssprev { 32 | width: 25px; 33 | height: 100%; 34 | margin: 0; 35 | position: absolute; 36 | top: 0; 37 | background: url('../vendor/images/arr.png') no-repeat; 38 | } 39 | 40 | .sssprev { 41 | left: 3%; 42 | background-position: 0 50%; 43 | } 44 | 45 | .sssnext { 46 | right: 3%; 47 | background-position: -26px 50%; 48 | } 49 | 50 | .sssprev:hover, .sssnext:hover { 51 | cursor: pointer; 52 | } 53 | -------------------------------------------------------------------------------- /static/source/vendor/img/arr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/vendor/img/arr.png -------------------------------------------------------------------------------- /static/source/vendor/jquery-ui/images/ui-icons_444444_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/static/source/vendor/jquery-ui/images/ui-icons_444444_256x240.png -------------------------------------------------------------------------------- /static/source/vendor/js/sss.min.js: -------------------------------------------------------------------------------- 1 | (function(e,t,n,r){e.fn.sss=function(r){var i=e.extend({slideShow:true,startingSlide:0,speed:3500,showNav:true},r);return this.each(function(){function m(e){return s.eq(e).height()/r.width()*100+"%"}function g(e){if(!f){f=true;var t=s.eq(e);t.fadeIn();s.not(t).fadeOut();r.animate({paddingBottom:m(e)},function(){f=false});v()}}function y(){a=a===o-1?0:a+1;g(a)}function b(){a=a===0?o-1:a-1;g(a)}e(this).children().wrapAll('
    ').addClass("ssslide");var r=e(this).find(".sss"),s=r.find(".ssslide"),o=s.length,u=i.startingSlide,a=u>o-1?0:u,f=false,l,c,h,p,d,v=i.slideShow?function(){clearTimeout(c);c=setTimeout(y,i.speed)}:e.noop;if(i.showNav){r.append('
    ','
    ')}d=r.find(".sssnext"),p=r.find(".sssprev");e(t).load(function(){r.css({paddingBottom:m(a)}).click(function(t){l=e(t.target);if(l.is(d)){y()}else if(l.is(p)){b()}});g(a);e(n).keydown(function(e){h=e.keyCode;if(h===39){y()}else if(h===37){b()}})})})}})(jQuery,window,document) -------------------------------------------------------------------------------- /story/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/story/__init__.py -------------------------------------------------------------------------------- /story/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | from story.models import Story 4 | 5 | 6 | @admin.register(Story) 7 | class StoryAdmin(admin.ModelAdmin): 8 | list_display = ("name", "is_story", "created") 9 | search_fields = ("name", "content") 10 | list_filter = ("is_story",) 11 | -------------------------------------------------------------------------------- /story/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class StoryConfig(AppConfig): 5 | name = "story" 6 | -------------------------------------------------------------------------------- /story/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/story/management/__init__.py -------------------------------------------------------------------------------- /story/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/story/management/commands/__init__.py -------------------------------------------------------------------------------- /story/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 1.11.5 on 2017-12-16 21:24 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | initial = True 8 | 9 | dependencies = [] 10 | 11 | operations = [ 12 | migrations.CreateModel( 13 | name="Story", 14 | fields=[ 15 | ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")), 16 | ("name", models.CharField(max_length=200)), 17 | ("content", models.TextField(null=True)), 18 | ("post_url", models.URLField()), 19 | ("image", models.ImageField(null=True, upload_to="stories/")), 20 | ("created", models.DateField(auto_now_add=True)), 21 | ("is_story", models.BooleanField(default=True)), 22 | ], 23 | options={ 24 | "verbose_name": "story", 25 | "verbose_name_plural": "stories", 26 | }, 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /story/migrations/0002_alter_story_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.7 on 2021-09-06 09:15 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | dependencies = [ 8 | ("story", "0001_initial"), 9 | ] 10 | 11 | operations = [ 12 | migrations.AlterField( 13 | model_name="story", 14 | name="id", 15 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID"), 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /story/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DevPioneer007/FastAPI-website/022892b0f32a10d3708f0629c12bec800f2a667f/story/migrations/__init__.py -------------------------------------------------------------------------------- /story/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.utils.translation import gettext_lazy as _ 3 | 4 | 5 | class Story(models.Model): 6 | name = models.CharField(max_length=200) 7 | content = models.TextField(null=True) 8 | post_url = models.URLField() 9 | image = models.ImageField(upload_to="stories/", null=True) 10 | created = models.DateField(auto_now_add=True) 11 | # False means a regular blogpost, not a story 12 | is_story = models.BooleanField(default=True) 13 | 14 | def __str__(self): 15 | return self.name 16 | 17 | def get_absolute_url(self): 18 | return self.post_url 19 | 20 | class Meta: 21 | verbose_name = _("story") 22 | verbose_name_plural = _("stories") 23 | -------------------------------------------------------------------------------- /story/sitemap.py: -------------------------------------------------------------------------------- 1 | from django.contrib.sitemaps import Sitemap 2 | 3 | from .models import Story 4 | 5 | 6 | class BlogSiteMap(Sitemap): 7 | priority = 0.5 8 | 9 | def items(self): 10 | return Story.objects.all().order_by("-created") 11 | 12 | def location(self, item): 13 | url = item.post_url 14 | if url is not None and "http://" in url: 15 | return url.replace("http://", "") 16 | else: 17 | return url.replace("https://", "") 18 | 19 | def lastmod(self, obj): 20 | return obj.created 21 | 22 | def _urls(self, page, protocol, domain): 23 | return super()._urls(page=page, protocol="https", domain="") 24 | -------------------------------------------------------------------------------- /story/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | 3 | from story.views import StoryListView 4 | 5 | app_name = "story" 6 | urlpatterns = [ 7 | path("", StoryListView.as_view(), name="stories"), 8 | ] 9 | -------------------------------------------------------------------------------- /story/views.py: -------------------------------------------------------------------------------- 1 | from django.views.generic.list import ListView 2 | 3 | from story.models import Story 4 | 5 | 6 | class StoryListView(ListView): 7 | context_object_name = "stories" 8 | template_name = "story/stories.html" 9 | queryset = Story.objects.filter(is_story=True).order_by("-created") 10 | -------------------------------------------------------------------------------- /templates/404.html: -------------------------------------------------------------------------------- 1 | {% extends 'global/base.html' %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 |
    6 |
    7 |
    8 |

    {% trans "Page not found" %}

    9 | 10 |

    {% trans "Sorry! The page you're looking for isn't available." %}

    11 | 12 | {% url 'core:events' as events_url %} 13 |

    {% blocktrans %}See all upcoming events.{% endblocktrans %}

    14 | 15 | {% url 'organize:index' as organise_url %} 16 |

    17 | {% blocktrans trimmed %} 18 | Find out about organizing a Django Girls workshop in your city. 19 | {% endblocktrans %} 20 |

    21 |
    22 |
    23 |
    24 | {% endblock content %} 25 | -------------------------------------------------------------------------------- /templates/admin/applications/form/view_submissions.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base_site.html" %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 |

    {% trans "Submitted applications" %}

    6 | {% if forms %} 7 |

    {% trans "To see applications that have been submitted to your workshop, choose an event from the list below:" %}

    8 | 13 | {% else %} 14 |

    15 | {% url 'admin:applications_form_add' as add_url %} 16 | {% blocktrans trimmed %} 17 | To see submitted applications, you need to add an application form first. 18 | {% endblocktrans %} 19 |

    20 | {% endif %} 21 | {% endblock %} 22 | -------------------------------------------------------------------------------- /templates/admin/base_site.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base.html" %} 2 | {% load static %} 3 | {% load i18n rev %} 4 | 5 | {% block title %}{{ title }} | {% trans "Django Girls admin" %}{% endblock %} 6 | 7 | {% block extrastyle %} 8 | {{ block.super }} 9 | 10 | 11 | {% endblock %} 12 | 13 | {% block branding %} 14 |

    15 | {% endblock %} 16 | 17 | {% block nav-global %}{% endblock %} -------------------------------------------------------------------------------- /templates/admin/core/event/change_form.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/change_form.html" %} 2 | {% load i18n %} 3 | 4 | {% block object-tools-items %} 5 | 6 | {{ block.super }} 7 | {% endblock %} 8 | -------------------------------------------------------------------------------- /templates/admin/core/event/view_add_organizers.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base_site.html" %} 2 | {% load i18n %} 3 | 4 | 5 | {% block content %} 6 |

    {% trans "Add a new organizer to your event" %}

    7 |

    {% trans "We will send them access instructions through automated email." %}

    8 | 9 |
    10 |
    11 |
    12 |
    13 | {% csrf_token %} 14 |
    15 |
    16 | {% for field in form %} 17 |
    18 |
    19 |
    20 | {{ field.label }} 21 |
    22 |
    23 | {{ field }} 24 | {{ field.errors }} 25 |
    26 |
    27 |
    28 | {% endfor %} 29 |
    30 |
    31 |
    32 |
    33 | 34 |
    35 |
    36 |
    37 |
    38 |
    39 |
    40 |
    41 |
    42 |
    43 | {% endblock %} 44 | -------------------------------------------------------------------------------- /templates/applications/event_not_live.html: -------------------------------------------------------------------------------- 1 | {% extends 'global/base.html' %} 2 | {% load i18n %} 3 | 4 | {% block content %} 5 |
    6 |
    7 |
    8 |

    {{ city|title }}

    9 | {% if past %} 10 |

    11 | {% blocktrans trimmed %} 12 | The event for {{ city|title }} has already happened and the webpage is 13 | no longer live. 14 | {% endblocktrans %} 15 |

    16 | {% else %} 17 |

    18 | {% blocktrans %} 19 | The event page for {{ city|title }} will be coming soon. 20 | {% endblocktrans %} 21 |

    22 | {% endif %} 23 |

    24 | {% blocktrans trimmed %} 25 | If you want to contact the organizers of this event, you can email them at 26 | {{ page_url|lower }}@djangogirls.org 27 | {% endblocktrans %} 28 |

    29 | 30 | {% url 'core:events' as events_url %} 31 |

    {% blocktrans %}See all other upcoming events.{% endblocktrans %}

    32 |
    33 |
    34 | {% endblock content %} 35 | 36 | -------------------------------------------------------------------------------- /templates/applications/rsvp.html: -------------------------------------------------------------------------------- 1 | {% extends 'core/event.html' %} 2 | {% load i18n static %} 3 | 4 | {% block content %} 5 | 6 |
    7 |
    8 |
    9 |

    {% trans "Your answer has been saved!" %}

    10 | {{ message }} 11 |
    12 |
    13 |
    14 |
    15 |
    16 | 17 | {% endblock %} 18 | -------------------------------------------------------------------------------- /templates/core/events_map.html: -------------------------------------------------------------------------------- 1 | {% extends 'global/base.html' %} 2 | {% load i18n static %} 3 | 4 | {% block extra_css %} 5 | 6 | {% endblock %} 7 | 8 | {% block extra_js %} 9 | 10 | {% endblock %} 11 | 12 | {% block content %} 13 | 14 |
    15 |

    {% trans "Django Girls events" %}

    16 |
    17 |
    18 | 19 | {% include "core/map.html" with events=events mapbox_access_token=mapbox_access_token %} 20 | 21 | {% endblock %} 22 | -------------------------------------------------------------------------------- /templates/core/txt/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: /admin/ 3 | Disallow: /accounts/ 4 | -------------------------------------------------------------------------------- /templates/default/about.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 |
    4 |

    {% trans "Free programming workshop for women" %}

    5 |

    {% trans "Build your first website at EuroPython 2014 in Berlin!" %}

    6 | {% trans "Learn more" %} » 7 |
    8 | -------------------------------------------------------------------------------- /templates/default/apply.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 |
    4 |
    5 |

    {% trans "Applications are now open!" %}

    6 |

    7 | {% trans "Application process closes on July 23rd and you'll be informed about acceptance or rejection by July 28th (or sooner)!" %} 8 |

    9 | {# TODO: This link probably doesn't work #} 10 | {% trans "Register" %} 11 |
    12 |
    -------------------------------------------------------------------------------- /templates/default/coach.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 |
    4 |
    5 |

    {% trans "Be a Mentor!" %}

    6 |

    7 | {% url 'contact:landing' as contact_url %} 8 | {% blocktrans trimmed %} 9 | We would be delighted if you would like to join us as a mentor! 10 | Contact us if you're interested ❤️ 11 | {% endblocktrans %} 12 |

    13 |
    14 | 15 |
    16 |

    {% trans "Django Girls" %}

    17 |

    18 | {% blocktrans trimmed %} 19 | This workshop is a part of bigger initiative: Django Girls. 20 | It is a non-profit organization and events are organized by volunteers in different places of the world. 21 | {% endblocktrans %} 22 |

    23 |

    24 | {% blocktrans trimmed %} 25 | To see the source for the program find us on Github: 26 | github.com/DjangoGirls. 27 | {% endblocktrans %} 28 |

    29 |

    30 | {% blocktrans trimmed %} 31 | If you want to bring Django Girls to your city, drop us a line 32 | {% endblocktrans %} 33 |

    34 |
    35 |
    36 | -------------------------------------------------------------------------------- /templates/default/footer.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 |
    4 | 36 | 37 |
    38 |
    39 | {% blocktrans trimmed %} 40 | ♥ Django Girls Europe is organized by Ola Sitarska 41 | and Ola Sendecka with the support from 42 | EuroPython 2014.
    43 | 44 | Django Girls Europe is a part of Django Girls. 45 | {% endblocktrans %} 46 |
    47 |
    48 |
    49 | -------------------------------------------------------------------------------- /templates/default/partners.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 |

    {% trans "Sponsors" %}

    4 | 5 |

    6 | {% url 'contact:landing' as contact_url %} 7 | {% blocktrans trimmed %} 8 | We couldn't be here without the support from amazing people and organizations 9 | who donated money, knowledge and time to help us make this a reality. 10 | If you want to contribute and support our goal, please get it touch 11 | {% endblocktrans %} 12 |

    -------------------------------------------------------------------------------- /templates/donations/error.html: -------------------------------------------------------------------------------- 1 | {% extends 'global/base.html' %} 2 | {% load i18n static %} 3 | 4 | {% block content %} 5 |
    6 |
    7 |

    {% trans "Error" %}

    8 |

    9 | {% trans "Sorry, an error has occurred" %} 10 |

    11 | {% if stripe_message %} 12 |

    {{ stripe_message }}

    13 | {% endif %} 14 |
    15 | ← {% trans "Back to donation page" %} 16 |
    17 |
    18 | 19 | {% endblock content %} -------------------------------------------------------------------------------- /templates/donations/success.html: -------------------------------------------------------------------------------- 1 | {% extends 'global/base.html' %} 2 | {% load i18n static %} 3 | 4 | {% block content %} 5 |
    6 |
    7 |

    8 | {% blocktrans trimmed with currency=currency amount=amount %} 9 | Thank you for your contribution of {{ currency }}{{amount}}! 10 | {% endblocktrans %} 11 |

    12 |
    13 | ← {% trans "Back to donation page" %} 14 |
    15 |
    16 | 17 | {% endblock content %} -------------------------------------------------------------------------------- /templates/emails/application_confirmation.html: -------------------------------------------------------------------------------- 1 | {{ intro|safe|linebreaks }} 2 | 3 | ---- 4 | 5 | {% for answer in application.answer_set.all %} 6 |

    {{ answer.question.title|safe }}
    7 | {{ answer.answer|linebreaksbr }}

    8 | {% endfor %} 9 | -------------------------------------------------------------------------------- /templates/emails/event_thank_you_subject.txt: -------------------------------------------------------------------------------- 1 | Congratulations for organizing Django Girls {{event.city}}! -------------------------------------------------------------------------------- /templates/emails/existing_user.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 |

    {% trans "Hi there!" %}

    4 | 5 |

    {% blocktrans with event=event.name %}Congrats! You can now manage {{ event }} event!{% endblocktrans %}

    6 | 7 |

    {% blocktrans with page_url=event.page_url %}The website address is https://djangogirls.org/{{ page_url }}{% endblocktrans %}

    8 | 9 |

    10 | {% blocktrans trimmed %} 11 | To manage it, login here:
    12 | https://djangogirls.org/admin/ 13 | {% endblocktrans %} 14 |

    15 | 16 |

    17 | {% blocktrans trimmed with email=user.email %} 18 | Email: {{ email }}
    19 | Use your existing password. 20 | {% endblocktrans %} 21 |

    22 | 23 |

    {% trans "Here you can find instructions on editing website: https://organize.djangogirls.org/website/" %}

    24 | 25 |

    26 | {% blocktrans with email=event.email %} 27 | Your event's email is {{ email }}. Ask the main organizer of you event 28 | for password and instructions to access it. 29 | {% endblocktrans %} 30 |

    31 | 32 |

    33 | {% blocktrans trimmed %} 34 | You can contact hello@ if you need assistance but it's usually faster to check Slack channel - there are more people that can help you! :) 35 | {% endblocktrans %} 36 |

    37 | 38 |

    39 | {% trans "Hugs, rainbows and sunshines!" %}
    40 | Django Girls 41 |

    42 | -------------------------------------------------------------------------------- /templates/emails/globalpartners/promotional_material.html: -------------------------------------------------------------------------------- 1 | 2 |

    Hello {{ contact_person.split.0 }},

    3 | 4 |

    Thank you for supporting our work.

    5 | 6 | {% if sponsor_level == "Bronze" and prospective_sponsor %} 7 |

    May I please have your company logo and a short write-up for 8 | announcing you as our sponsor on social media, and any company pictures you may have?

    9 | {% elif prospective_sponsor %} 10 |

    May I please have your company logo, company pictures and a short write-up on your company so I can do a blog post 11 | announcing you as our global sponsor as well as for use in our periodic tweets on our sponsors?

    12 |

    13 | {% else %} 14 |

    For our existing sponsors, we can either announce them again or offer them the chance to publish a guest post on our blog. 15 | If you have a post you would like featured on our blog, you can send it to me and we can post it on your behalf if it 16 | meets our Code of Conduct.

    17 | {% endif %} 18 | 19 |

    Once again, thank you for supporting our work.

    20 |
    21 |

    Sparkles, cupcakes and high-fives, 🎉🎊🎉✨🍰👋

    22 | 23 |

    Anna Makarudze
    24 | Fundraising Coordinator,
    25 | Django Girls Foundation 26 |

    27 | 28 | -------------------------------------------------------------------------------- /templates/emails/globalpartners/prospective_sponsor.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

    Hello {{ contact_person.split.0 }}

    4 | 5 |

    My name is Anna Makarudze. I am the fundraising coordinator for Django Girls Foundation.

    6 | 7 |

    We are currently looking for new corporate sponsors who will sponsor us through either monthly donations 8 | or with a once off annual donation. I would like to check with you if your company would consider sponsoring Django Girls.

    9 | 10 |

    Please see attached our sponsors deck for 2023 https://drive.google.com/file/d/1T2jL9tnu5ZkNvkQRAxd7jlt_BnX7VCLE/view 11 | for our sponsor packages.

    12 | 13 |

    If your organisation is interested, kindly get back to me and we can discuss next steps or set up a meeting 14 | if you would like to get on a call for more details.

    15 | 16 |

    Looking forward to hearing from you soon.

    17 |
    18 |

    Sparkles, cupcakes and high-fives, 🎉🎊🎉✨🍰👋

    19 | 20 |

    21 | Anna Makarudze
    22 | Fundraising Coordinator,
    23 | Django Girls Foundation 24 |

    25 | 26 | -------------------------------------------------------------------------------- /templates/emails/globalpartners/thank_you.html: -------------------------------------------------------------------------------- 1 | 2 |

    Hello {{ contact_person.split.0 }}

    3 | 4 |

    We would like to thank you for supporting our work this year and look forward to working with you 5 | in the new year.

    6 | 7 |

    Happy holidays from all of us at Django Girls!

    8 |
    9 |

    Sparkles, cupcakes and high-fives, 🎉🎊🎉✨🍰👋

    10 | 11 |

    Anna Makarudze
    12 | Fundraising Coordinator,
    13 | Django Girls Foundation 14 |

    15 | -------------------------------------------------------------------------------- /templates/emails/new_user.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 |

    {% trans "Hi there!" %}

    4 | 5 |

    {% trans "Congrats! You're now a Django Girls organizer, so awesome! Here is access to your website:" %}

    6 | 7 |

    {% blocktrans with page_url=event.page_url %}Your website address is https://djangogirls.org/{{ page_url }}{% endblocktrans %}

    8 | 9 |

    10 | {% blocktrans trimmed %} 11 | Login here:
    12 | https://djangogirls.org/admin/ 13 | {% endblocktrans %} 14 |

    15 | 16 |

    17 | {% blocktrans with email=user.email %} 18 | Email: {{ email }}
    19 | Password: {{ password }} 20 | {% endblocktrans %} 21 |

    22 | 23 |

    {% trans "Here you can find instructions on editing website: https://organize.djangogirls.org/website/" %}

    24 | 25 |

    26 | {% blocktrans trimmed with email=event.email %} 27 | Your event's email is {{ email }}. Ask the main organizer of you event 28 | for password and instructions to access it. 29 | {% endblocktrans %} 30 |

    31 | 32 |

    {% trans "We also invited you to Django Girls Slack, where we chat, communicate and meet each other!" %}

    33 | 34 |

    35 | {% blocktrans trimmed %} 36 | You can contact hello@ if you need assistance but it's usually faster to check Slack channel - there are more people that can help you! :)* 37 | {% endblocktrans %} 38 |

    39 | 40 |

    41 | {% trans "Hugs, rainbows and sunshines!" %}
    42 | Django Girls 43 |

    44 | -------------------------------------------------------------------------------- /templates/emails/offer_help_email.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 |

    {% blocktrans with event=event.city %}Hi team {{ event }}!{% endblocktrans %}

    4 | 5 |

    {% trans "How are you? We hope you are doing fantastic! :)" %}

    6 | 7 |

    8 | {% blocktrans trimmed with event=event.city %} 9 | We've noticed that the Django Girls {{event.city}} event has no live website or isn’t open for applications yet. 10 | Is everything going well with preparations? 11 | {% endblocktrans %} 12 |

    13 | 14 |

    {% trans "Let us know how it goes. If you're stuck on something, we can definitely help! :)" %}

    15 | 16 |

    17 | {% trans "Hugs, cupcakes and sparkles" %},
    18 | Django Girls team 19 |

    20 | -------------------------------------------------------------------------------- /templates/emails/offer_help_email.txt: -------------------------------------------------------------------------------- 1 | Hi team {{event.city}}! 2 | 3 | How are you? We hope you are doing fantastic! :) 4 | 5 | We've noticed that the Django Girls {{event.city}} event has no live website or isn’t open for applications yet. Is everything going well with preparations? 6 | 7 | Let us know how it goes. If you're stuck on something, we can definitely help! :) 8 | 9 | Hugs, cupcakes and sparkles, 10 | Django Girls team 11 | -------------------------------------------------------------------------------- /templates/emails/offer_help_subject.txt: -------------------------------------------------------------------------------- 1 | Need any help with your Django Girls {{event.city}} event? -------------------------------------------------------------------------------- /templates/emails/organize/rejection.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 |

    {% trans "Hello there," %}

    4 | 5 |

    6 | {% blocktrans trimmed with city=application.city %} 7 | Thank you so much for taking the time to submit an application to organize Django Girls {{ city }} workshop. 8 | {% endblocktrans %} 9 |

    10 | 11 |

    12 | {% blocktrans trimmed %} 13 | We reviewed your application and we think that you need to do a little bit more planning before we can give you a positive answer. 14 | Please read our Organizer’s Manual and ensure you meet all the requirements to host 15 | a workshop carefully, and then read experiences of other organizers on our blog: 16 | Seoul, 17 | Wrocław, 18 | Windhoek 19 | or Budapest 20 | to see how much work is required to organize the workshop. 21 | {% endblocktrans %} 22 |

    23 | 24 |

    25 | {% trans "When you have more things planned (like potential date, venue, coaches or sponsors), get back to us by filling out the form again." %} 26 |

    27 | 28 |

    29 | {% blocktrans trimmed %} 30 | Have a lovely day and thank you again for reaching out to us!
    31 | Django Girls team 32 | {% endblocktrans %} 33 |

    34 | -------------------------------------------------------------------------------- /templates/emails/setup-short.txt: -------------------------------------------------------------------------------- 1 | Event e-mail is: {{ event.email }} 2 | Event website address is: https://djangogirls.org/{{ event.page_url }} 3 | -------------------------------------------------------------------------------- /templates/emails/submit_information_email.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 |

    {% blocktrans with event=event.city %}Hello team {{ event }}!{% endblocktrans %}

    4 | 5 |

    {% trans "Hope you’re all doing fantastic and took some well deserved rest after organizing your Django Girls workshop :)" %}

    6 | 7 |

    8 | {% url 'admin:core_event_change' event.id as event_url %} 9 | {% blocktrans trimmed with base=settings.BASE_URL %} 10 | Just a friendly reminder to fill out this form to provide information how 11 | many people attended your workshop. This will help us show the global impact that Django Girls is having on the world! :) 12 | {% endblocktrans %} 13 |

    14 | 15 |

    16 | {% trans "Hugs, rainbows and sunshines!" %}
    17 | Django Girls 18 |

    19 | -------------------------------------------------------------------------------- /templates/emails/submit_information_email.txt: -------------------------------------------------------------------------------- 1 | Hello team {{event.city}}! 2 | 3 | Hope you’re all doing fantastic and took some well deserved rest after organizing your Django Girls workshop :) 4 | 5 | Just a friendly reminder to fill out the form at {{ settings.BASE_URL }}{% url 'admin:core_event_change' event.id %} to provide information how many people attended your workshop. This will help us show the global impact that Django Girls is having on the world! :) 6 | 7 | Hugs, rainbows and sunshines! 8 | Django Girls 9 | -------------------------------------------------------------------------------- /templates/emails/submit_information_subject.txt: -------------------------------------------------------------------------------- 1 | Reminder to submit information from Django Girls {{event.city}} -------------------------------------------------------------------------------- /templates/event/menu.html: -------------------------------------------------------------------------------- 1 | {% load core_tags i18n static %} 2 | 3 | 25 | -------------------------------------------------------------------------------- /templates/flatpage.html: -------------------------------------------------------------------------------- 1 | {% extends 'global/base.html' %} 2 | {% load static markdown_deux_tags %} 3 | 4 | {% block title %}{{ flatpage.title }}{% endblock %} 5 | 6 | {% block content %} 7 |
    8 |
    9 |
    10 |

    {{ flatpage.title }}

    11 | 12 | {{ flatpage.content|safe|markdown:"trusted" }} 13 |
    14 |
    15 |
    16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /templates/includes/_coach.html: -------------------------------------------------------------------------------- 1 | {% load thumbnail %} 2 | 3 | {% if coach.url %} 4 | 5 | 6 | 7 |
    8 | {{ coach.name }} 9 | {% else %} 10 | 11 | 12 | 13 |
    14 | {{ coach.name }} 15 | {% endif %} 16 | 17 |
    18 | {% if coach.twitter_handle %}@{{ coach.twitter_handle }}
    {% endif %} 19 | -------------------------------------------------------------------------------- /templates/includes/_event.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 | 4 |
    5 |
    6 |

    {{ event.city }}

    7 | {{ event.date }} 8 | {% if event.photo_credit %}

    {% trans "Photo credit:" %} {{ event.photo_credit }} (CC)

    {% endif %} 9 |
    10 |
    11 |
    12 | -------------------------------------------------------------------------------- /templates/includes/_field.html: -------------------------------------------------------------------------------- 1 | 5 | 6 | {% if field.field.help_text %} 7 |

    {{ field.field.help_text|safe }}

    8 | {% endif %} 9 | 10 | {% if field.errors %} 11 | {% for error in field.errors %} 12 |

    {{ error }}

    13 | {% endfor %} 14 | {% endif %} 15 | 16 |
    17 | {{ field }} 18 |
    19 | -------------------------------------------------------------------------------- /templates/includes/_form.html: -------------------------------------------------------------------------------- 1 | {% for field in form %} 2 |
    3 |
    4 | {% include 'includes/_field.html' with field=field %} 5 |
    6 |
    7 | {% endfor %} 8 | -------------------------------------------------------------------------------- /templates/includes/_info_messages.html: -------------------------------------------------------------------------------- 1 | {% for message in messages %} 2 | 8 | {% endfor %} 9 | -------------------------------------------------------------------------------- /templates/includes/_main_supporters.html: -------------------------------------------------------------------------------- 1 | {% load static %} 2 | 3 |
    4 |
    5 | 6 | Python Software Foundation 8 | 9 |
    10 |
    11 | 12 | Sentry 14 | 15 |
    16 |
    17 | 18 | -------------------------------------------------------------------------------- /templates/includes/_no_event.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | 3 |
    4 |
    5 |

    {% trans "Don't see an event in your city?" %}

    6 |
    7 |
    8 | 9 |
    10 |
    11 |

    {% trans "Sign up for our newsletter" %}

    12 |

    13 | {% trans "Stay up to date with everything that's happening in Django Girls valley:" %} 14 |

    15 |
    16 | 17 | 18 | 19 |
    20 |
    21 |
    22 | 23 |
    24 |
    25 |

    {% trans "Bring Django Girls to your city!" %}

    26 |

    27 | {% trans "Everyone can organize their own Django Girls event and share it with their community." %} 28 |

    29 | {% trans "Find out more" %} 30 |
    31 |
    32 | -------------------------------------------------------------------------------- /templates/includes/_organize-progress.html: -------------------------------------------------------------------------------- 1 |
    2 |
      3 | {# List of organize steps, space delimited #} 4 | {# TODO This needs a rethink for translation #} 5 | {% with 'Prerequisites Commitment Application Organizers How Workshop 🎉' as steps %} 6 | {% for step in steps.split %} 7 |
    • 8 | {{ step }} 9 |
    • 10 | {% endfor %} 11 | {% endwith %} 12 |
    13 |
    14 | -------------------------------------------------------------------------------- /templates/includes/_sponsor.html: -------------------------------------------------------------------------------- 1 | {% load thumbnail %} 2 | 3 |
    4 | 5 | {% if sponsor.logo %} 6 | {{ sponsor.name }} 7 | {% else %} 8 | {{ sponsor.name }} 9 | {% endif %} 10 | 11 | {% if sponsor.description %}

    {{ sponsor.description }}

    {% endif %} 12 |
    13 | {% if forloop.counter|divisibleby:4 %}