├── .dockerignore ├── fm_eventmanager ├── __init__.py ├── wsgi.py ├── wsgi_docker.py └── urls.py ├── registration ├── static │ ├── temp.foo │ ├── favicon.ico │ ├── favicon.png │ ├── img │ │ ├── 2017 │ │ │ ├── logo.jpg │ │ │ └── Logo-promo.png │ │ ├── 503.png │ │ ├── fmbottom.png │ │ ├── bootstrap-formhelpers-googlefonts.png │ │ ├── bootstrap-formhelpers-countries.flags.png │ │ ├── bootstrap-formhelpers-currencies.flags.png │ │ └── bootstrap-formhelpers-countries.flags-LICENSE.txt │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── apple-touch-icon.png │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── css │ │ └── fonts │ │ │ ├── Fixedsys500c.eot │ │ │ ├── Fixedsys500c.otf │ │ │ ├── Fixedsys500c.ttf │ │ │ └── Fixedsys500c.woff │ ├── fonts │ │ ├── bootstrap-icons.woff │ │ ├── bootstrap-icons.woff2 │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ ├── webfonts │ │ ├── fa-brands-400.ttf │ │ ├── fa-solid-900.ttf │ │ ├── fa-brands-400.woff2 │ │ ├── fa-regular-400.ttf │ │ ├── fa-solid-900.woff2 │ │ ├── fa-regular-400.woff2 │ │ ├── fa-v4compatibility.ttf │ │ └── fa-v4compatibility.woff2 │ ├── ATTRIBUTION │ ├── js │ │ ├── upgrade.js │ │ ├── main-init-sentry.js │ │ ├── _site │ │ │ └── npm.js │ │ ├── templates │ │ │ └── staff.js │ │ ├── dealers │ │ │ └── dealerasst-add.js │ │ ├── date-entry.js │ │ └── checkout.js │ ├── site.webmanifest │ └── admin │ │ └── js │ │ └── jquery.init.js ├── tests │ ├── __init__.py │ ├── test_templates.py │ ├── test_signals.py │ └── test_registration_tags.py ├── utils │ └── __init__.py ├── views │ └── __init__.py ├── management │ ├── __init__.py │ └── commands │ │ ├── __init__.py │ │ ├── start_db.py │ │ └── stop_db.py ├── migrations │ ├── __init__.py │ ├── 0066_merge_20180726_1722.py │ ├── 0081_merge_20181231_1518.py │ ├── 0105_add_trigram_extensions_20241114_1419.py │ ├── 0020_remove_dealer_extratable.py │ ├── 0093_add_dealerasst_paid.py │ ├── 0099_webhook_completed.py │ ├── 0029_dealer_emailed.py │ ├── 0033_discount_used.py │ ├── 0080_banlist_reason.py │ ├── 0038_auto_20170128_1001.py │ ├── 0059_attendee_aslrequest.py │ ├── 0064_event_default.py │ ├── 0069_temptoken_sent.py │ ├── 0074_staff_checkedin.py │ ├── 0075_dealer_logo.py │ ├── 0041_auto_20170217_1825.py │ ├── 0042_attendee_printed.py │ ├── 0045_order_lastfour.py │ ├── 0050_attendee_surveyok.py │ ├── 0028_order_status.py │ ├── 0056_dealer_asstbreakfast.py │ ├── 0002_auto_20160726_2342.py │ ├── 0076_event_allowonlineminorreg.py │ ├── 0077_priceleveloption_rank.py │ ├── 0016_priceleveloption_required.py │ ├── 0026_dealer_buttonoffer.py │ ├── 0062_auto_20180416_0020.py │ ├── 0068_auto_20180512_2104.py │ ├── 0079_pricelevel_isminor.py │ ├── 0107_mqtt_printing_per_terminal.py │ ├── 0078_priceleveloption_description.py │ ├── 0025_tablesize_baseprice.py │ ├── 0068_auto_20180802_2110.py │ ├── 0104_add_event_website_url.py │ ├── 0030_auto_20161221_1121.py │ ├── 0060_priceleveloption_optionimage.py │ ├── 0087_onsite_reg_start.py │ ├── 0091_alter_firebase_webview.py │ ├── 0005_auto_20160806_1650.py │ ├── 0067_auto_20180512_2055.py │ ├── 0049_auto_20170511_2106.py │ ├── 0023_auto_20161020_1843.py │ ├── 0039_auto_20170129_1410.py │ ├── 0051_orderitem_badge.py │ ├── 0007_auto_20160821_1554.py │ ├── 0021_auto_20161013_1941.py │ ├── 0009_auto_20160821_1340.py │ ├── 0015_auto_20160926_1927.py │ ├── 0073_dealerasst_event.py │ ├── 0100_webhook_type.py │ ├── 0057_tablesize_event.py │ ├── 0097_temptoken_ignore_time_window.py │ ├── 0027_auto_20161104_2004.py │ ├── 0046_auto_20170427_1003.py │ ├── 0024_auto_20161020_1910.py │ ├── 0052_auto_20170715_1734.py │ ├── 0055_auto_20171009_1134.py │ ├── 0047_auto_20170428_2054.py │ ├── 0088_webview_null.py │ ├── 0017_auto_20161009_1154.py │ ├── 0071_auto_20180721_2029.py │ ├── 0102_event_dealer_wifi_partner_price.py │ ├── 0031_auto_20161223_1717.py │ ├── 0037_auto_20161230_1154.py │ ├── 0092_dealer_asst_discount.py │ ├── 0044_auto_20170316_2219.py │ ├── 0094_add_preferred_name.py │ ├── 0036_staffjersey.py │ ├── 0058_banlist.py │ ├── 0022_auto_20161020_1832.py │ ├── 0087_firebase_provision.py │ ├── 0054_auto_20170920_2254.py │ ├── 0065_auto_20180425_2022.py │ ├── 0032_auto_20161223_1732.py │ ├── 0070_auto_20180719_1728.py │ ├── 0089_badge_signature.py │ ├── 0069_auto_20180802_2118.py │ ├── 0010_auto_20160828_1010.py │ ├── 0040_staffjersey.py │ ├── 0067_auto_20180802_2106.py │ ├── 0101_auto_20240630_0045.py │ ├── 0035_auto_20161228_1940.py │ ├── 0080_cart.py │ ├── 0066_temptoken.py │ ├── 0003_auto_20160727_0114.py │ ├── 0108_update_pricelevels.py │ ├── 0084_reservedbadgenumbers.py │ ├── 0103_auto_20241109_1543.py │ ├── 0018_auto_20161010_1838.py │ ├── 0060_auto_20180315_1852.py │ ├── 0098_auto_20230124_2055.py │ ├── 0095_add_cash_ledger_actions.py │ ├── 0092_auto_20211219_0409_squashed_0093_auto_20211219_0436.py │ ├── 0053_auto_20170916_1047.py │ ├── 0086_rename_tables.py │ ├── 0096_square_webhooks.py │ ├── 0085_auto_20200215_1029_squashed_0086_auto_20200215_1051.py │ └── 0063_auto_20180419_0210.py ├── templatetags │ ├── __init__.py │ ├── settings.py │ ├── registration_tags.py │ └── site.py ├── apps.py ├── __init__.py ├── resources │ └── nametag │ │ ├── fd_labels │ │ ├── back.png │ │ ├── friday.png │ │ ├── sunday.png │ │ ├── back-old.png │ │ ├── barista.png │ │ ├── customer.png │ │ ├── manager.png │ │ ├── saturday.png │ │ ├── pastrychef.png │ │ ├── fd_labels.conf │ │ ├── furrydelphia-cr80.conf │ │ ├── stylesheet.css │ │ ├── generator_config.txt │ │ └── jquery.fittext.js │ │ ├── furrydelphia │ │ ├── back.png │ │ ├── back-old.png │ │ ├── barista.png │ │ ├── customer.png │ │ ├── friday.png │ │ ├── manager.png │ │ ├── saturday.png │ │ ├── sunday.png │ │ ├── pastrychef.png │ │ ├── furrydelphia.conf │ │ ├── furrydelphia-cr80.conf │ │ ├── stylesheet.css │ │ ├── generator_config.txt │ │ └── jquery.fittext.js │ │ └── apis │ │ ├── apis.conf │ │ ├── default.conf │ │ ├── stylesheet.css │ │ ├── generator_config.txt │ │ └── jquery.fittext.js ├── context_processors.py ├── frontend │ ├── tsconfig.json │ ├── src │ │ └── admin │ │ │ ├── cart │ │ │ ├── index.ts │ │ │ └── components │ │ │ │ └── CartActionsError.tsx │ │ │ ├── providers │ │ │ ├── config-provider.tsx │ │ │ └── user-settings-provider.tsx │ │ │ ├── scan │ │ │ ├── components │ │ │ │ ├── CloseButton.tsx │ │ │ │ ├── MismatchedData.tsx │ │ │ │ ├── UrlEntry.tsx │ │ │ │ └── ScanPii.tsx │ │ │ └── index.ts │ │ │ ├── index.scss │ │ │ └── attendee-search │ │ │ ├── index.ts │ │ │ └── components │ │ │ └── BadgeTableLoader.tsx │ ├── package.json │ └── esbuild.mjs ├── templates │ ├── registration │ │ ├── emails │ │ │ ├── dealer │ │ │ │ ├── assistant.txt │ │ │ │ ├── assistant.html │ │ │ │ ├── assistant-form.txt │ │ │ │ ├── assistant-register.txt │ │ │ │ ├── assistant-form.html │ │ │ │ ├── assistant-register.html │ │ │ │ ├── dealer-notice.txt │ │ │ │ ├── dealer.txt │ │ │ │ ├── dealer-approval.txt │ │ │ │ ├── dealer.html │ │ │ │ ├── dealer-notice.html │ │ │ │ ├── dealer-approval.html │ │ │ │ └── payment.txt │ │ │ ├── staff │ │ │ │ ├── promotion.txt │ │ │ │ ├── registration.txt │ │ │ │ ├── promotion.html │ │ │ │ ├── registration.html │ │ │ │ ├── new.txt │ │ │ │ └── new.html │ │ │ ├── vip-notification.txt │ │ │ ├── vip-notification.html │ │ │ ├── upgrade.txt │ │ │ ├── upgrade.html │ │ │ ├── upgrade-instructions.txt │ │ │ ├── upgrade-instructions.html │ │ │ ├── registration.txt │ │ │ ├── chargeback-notice.txt │ │ │ └── chargeback-notice.html │ │ ├── customer-note.txt │ │ ├── dealer │ │ │ ├── dealer-update.html │ │ │ ├── dealer-closed.html │ │ │ ├── dealerasst-done.html │ │ │ ├── dealer-done.html │ │ │ └── dealer-thanks.html │ │ ├── staff │ │ │ ├── staff-done.html │ │ │ └── staff-closed.html │ │ ├── upgrade-done.html │ │ ├── done.html │ │ ├── closed.html │ │ ├── docs │ │ │ └── no-event.html │ │ ├── onsite-admin.html │ │ ├── onsite-done.html │ │ ├── printing.html │ │ ├── customer-display.html │ │ └── utility │ │ │ └── viplist.html │ ├── admin │ │ ├── square_devices_list.html │ │ ├── copy_event.html │ │ └── firebase_qr.html │ └── templatetags │ │ └── coc_sig.html ├── signals.py └── forms.py ├── prestart.sh ├── database.env ├── .envrc.example ├── docs └── admin-onsite.png ├── .coveragerc ├── .flake8 ├── debug_server ├── manage.py ├── .isort.cfg ├── DockerfileBase ├── templates ├── registration │ ├── logged_out.html │ └── password_change_form.html ├── 503.html ├── u2f │ ├── base.html │ ├── backup_codes.html │ ├── add_key.html │ └── totp_device.html └── admin │ └── registration │ └── firebase │ └── change_form.html ├── docker-compose.yaml ├── .gitignore ├── .pre-commit-config.yaml ├── requirements.txt ├── Dockerfile ├── nginx.conf ├── uwsgi.ini ├── pyproject.toml ├── .github └── workflows │ └── docker.yml └── example.env /.dockerignore: -------------------------------------------------------------------------------- 1 | .git/ 2 | -------------------------------------------------------------------------------- /fm_eventmanager/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /registration/static/temp.foo: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /registration/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /registration/utils/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /registration/views/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /registration/management/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /registration/migrations/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /registration/templatetags/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /registration/management/commands/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /prestart.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | ./manage.py migrate 4 | -------------------------------------------------------------------------------- /database.env: -------------------------------------------------------------------------------- 1 | POSTGRES_DB=apis 2 | POSTGRES_USER=apis 3 | POSTGRES_PASSWORD=secret 4 | -------------------------------------------------------------------------------- /.envrc.example: -------------------------------------------------------------------------------- 1 | source venv/bin/activate 2 | export GITHUB_USER= 3 | export GITHUB_CR_PAT= 4 | -------------------------------------------------------------------------------- /docs/admin-onsite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/docs/admin-onsite.png -------------------------------------------------------------------------------- /registration/static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/favicon.ico -------------------------------------------------------------------------------- /registration/static/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/favicon.png -------------------------------------------------------------------------------- /registration/static/img/503.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/img/503.png -------------------------------------------------------------------------------- /.coveragerc: -------------------------------------------------------------------------------- 1 | [run] 2 | omit = 3 | */migrations/* 4 | */tests/* 5 | venv/* 6 | /home/travis/virtualenv/* 7 | -------------------------------------------------------------------------------- /registration/static/img/fmbottom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/img/fmbottom.png -------------------------------------------------------------------------------- /registration/static/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/favicon-16x16.png -------------------------------------------------------------------------------- /registration/static/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/favicon-32x32.png -------------------------------------------------------------------------------- /registration/static/img/2017/logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/img/2017/logo.jpg -------------------------------------------------------------------------------- /registration/static/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/apple-touch-icon.png -------------------------------------------------------------------------------- /registration/static/img/2017/Logo-promo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/img/2017/Logo-promo.png -------------------------------------------------------------------------------- /registration/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class RegistrationConfig(AppConfig): 5 | name = "registration" 6 | -------------------------------------------------------------------------------- /registration/static/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/android-chrome-192x192.png -------------------------------------------------------------------------------- /registration/static/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/android-chrome-512x512.png -------------------------------------------------------------------------------- /registration/static/css/fonts/Fixedsys500c.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/css/fonts/Fixedsys500c.eot -------------------------------------------------------------------------------- /registration/static/css/fonts/Fixedsys500c.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/css/fonts/Fixedsys500c.otf -------------------------------------------------------------------------------- /registration/static/css/fonts/Fixedsys500c.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/css/fonts/Fixedsys500c.ttf -------------------------------------------------------------------------------- /registration/static/fonts/bootstrap-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/fonts/bootstrap-icons.woff -------------------------------------------------------------------------------- /registration/static/webfonts/fa-brands-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/webfonts/fa-brands-400.ttf -------------------------------------------------------------------------------- /registration/static/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /registration/static/css/fonts/Fixedsys500c.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/css/fonts/Fixedsys500c.woff -------------------------------------------------------------------------------- /registration/static/fonts/bootstrap-icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/fonts/bootstrap-icons.woff2 -------------------------------------------------------------------------------- /registration/static/webfonts/fa-brands-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/webfonts/fa-brands-400.woff2 -------------------------------------------------------------------------------- /registration/static/webfonts/fa-regular-400.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/webfonts/fa-regular-400.ttf -------------------------------------------------------------------------------- /registration/static/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /registration/__init__.py: -------------------------------------------------------------------------------- 1 | # __all__ = ['views', 'templatetags', 'admin', 'apps', 'emails', 'models', 2 | #'payments', 'printing', 'tests', 'urls'] 3 | -------------------------------------------------------------------------------- /registration/resources/nametag/fd_labels/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/fd_labels/back.png -------------------------------------------------------------------------------- /registration/resources/nametag/fd_labels/friday.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/fd_labels/friday.png -------------------------------------------------------------------------------- /registration/resources/nametag/fd_labels/sunday.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/fd_labels/sunday.png -------------------------------------------------------------------------------- /registration/static/webfonts/fa-regular-400.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/webfonts/fa-regular-400.woff2 -------------------------------------------------------------------------------- /registration/static/webfonts/fa-v4compatibility.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/webfonts/fa-v4compatibility.ttf -------------------------------------------------------------------------------- /registration/resources/nametag/fd_labels/back-old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/fd_labels/back-old.png -------------------------------------------------------------------------------- /registration/resources/nametag/fd_labels/barista.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/fd_labels/barista.png -------------------------------------------------------------------------------- /registration/resources/nametag/fd_labels/customer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/fd_labels/customer.png -------------------------------------------------------------------------------- /registration/resources/nametag/fd_labels/manager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/fd_labels/manager.png -------------------------------------------------------------------------------- /registration/resources/nametag/fd_labels/saturday.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/fd_labels/saturday.png -------------------------------------------------------------------------------- /registration/resources/nametag/furrydelphia/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/furrydelphia/back.png -------------------------------------------------------------------------------- /registration/static/webfonts/fa-v4compatibility.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/webfonts/fa-v4compatibility.woff2 -------------------------------------------------------------------------------- /registration/resources/nametag/fd_labels/pastrychef.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/fd_labels/pastrychef.png -------------------------------------------------------------------------------- /registration/resources/nametag/furrydelphia/back-old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/furrydelphia/back-old.png -------------------------------------------------------------------------------- /registration/resources/nametag/furrydelphia/barista.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/furrydelphia/barista.png -------------------------------------------------------------------------------- /registration/resources/nametag/furrydelphia/customer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/furrydelphia/customer.png -------------------------------------------------------------------------------- /registration/resources/nametag/furrydelphia/friday.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/furrydelphia/friday.png -------------------------------------------------------------------------------- /registration/resources/nametag/furrydelphia/manager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/furrydelphia/manager.png -------------------------------------------------------------------------------- /registration/resources/nametag/furrydelphia/saturday.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/furrydelphia/saturday.png -------------------------------------------------------------------------------- /registration/resources/nametag/furrydelphia/sunday.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/furrydelphia/sunday.png -------------------------------------------------------------------------------- /registration/static/ATTRIBUTION: -------------------------------------------------------------------------------- 1 | favicon.png: [https://www.flaticon.com/free-icons/files-and-folders](Files and folders icons created by Us and Up - Flaticon) 2 | -------------------------------------------------------------------------------- /registration/resources/nametag/furrydelphia/pastrychef.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/resources/nametag/furrydelphia/pastrychef.png -------------------------------------------------------------------------------- /registration/static/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /registration/static/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /.flake8: -------------------------------------------------------------------------------- 1 | [flake8] 2 | max-line-length = 100 3 | ignore = E203, E266, E501, W503 4 | exclude = .yaml,.json,.html,.js,.css 5 | 6 | [pycodestyle] 7 | max_line_length = 100 8 | -------------------------------------------------------------------------------- /registration/static/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /registration/static/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /registration/static/img/bootstrap-formhelpers-googlefonts.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/img/bootstrap-formhelpers-googlefonts.png -------------------------------------------------------------------------------- /debug_server: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | if [[ "$VIRTUAL_ENV" != "" ]]; then 3 | source ./venvs/apis/bin/activate 4 | fi 5 | DJANGO_DEBUG=1 python -Wall ./manage.py runserver_plus 6 | -------------------------------------------------------------------------------- /registration/static/img/bootstrap-formhelpers-countries.flags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/img/bootstrap-formhelpers-countries.flags.png -------------------------------------------------------------------------------- /registration/static/img/bootstrap-formhelpers-currencies.flags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/furthemore/APIS/HEAD/registration/static/img/bootstrap-formhelpers-currencies.flags.png -------------------------------------------------------------------------------- /registration/context_processors.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | 3 | 4 | def square_environment(request): 5 | return {"SQUARE_ENVIRONMENT": settings.SQUARE_ENVIRONMENT} 6 | -------------------------------------------------------------------------------- /registration/frontend/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "jsx": "preserve", 4 | "jsxImportSource": "solid-js", 5 | "strict": true 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /registration/frontend/src/admin/cart/index.ts: -------------------------------------------------------------------------------- 1 | import { CartManager, CartResponse } from "./cart-manager"; 2 | import { Cart } from "./components/Cart"; 3 | 4 | export { Cart, CartManager, CartResponse }; 5 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/dealer/assistant.txt: -------------------------------------------------------------------------------- 1 | 2 | Thank you for adding assistants to your order. 3 | 4 | Your assistants will receive an email with instructions about how to register. 5 | 6 | Thank you! 7 | -------------------------------------------------------------------------------- /registration/frontend/src/admin/providers/config-provider.tsx: -------------------------------------------------------------------------------- 1 | import { createContext } from "solid-js"; 2 | 3 | import { ApisConfig } from "../../entrypoints/admin"; 4 | 5 | export const ConfigContext = createContext(); 6 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/dealer/assistant.html: -------------------------------------------------------------------------------- 1 |

Thank you for adding assistants to your order.

2 |

Your assistants will receive an email with instructions about how to register.

3 |

Thank you!

4 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/staff/promotion.txt: -------------------------------------------------------------------------------- 1 | {% load site %} 2 | Welcome to {{event}} Staff! 3 | Use this link to register as staff: https://{% current_domain %}{% url 'registration:staff' guid=registrationToken %} 4 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/vip-notification.txt: -------------------------------------------------------------------------------- 1 | A VIP ({{badge.effectiveLevel}}) has just registered: 2 | 3 | Badge Name - {{badge.badgeName}} 4 | Real Name - {{badge.attendee}} 5 | Email - {{badge.attendee.email}} 6 | -------------------------------------------------------------------------------- /registration/static/js/upgrade.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function () { 2 | $("#cancel").click(function (e) { 3 | $.getJSON(URL_REGISTRATION_FLUSH, function (data) { 4 | window.location.reload(); 5 | }); 6 | }); 7 | }); -------------------------------------------------------------------------------- /registration/templates/registration/emails/vip-notification.html: -------------------------------------------------------------------------------- 1 |

A VIP ({{badge.effectiveLevel}}) has just registered:

2 | 3 |

Badge Name - {{badge.badgeName}} 4 |
Real Name - {{badge.attendee}} 5 |
Email - {{badge.attendee.email}} 6 |

7 | -------------------------------------------------------------------------------- /registration/resources/nametag/fd_labels/fd_labels.conf: -------------------------------------------------------------------------------- 1 | # CR-80 template 2 | [default] 3 | zoom = 1.22 #;zoom factor 4 | height = 102 #;size of page in mm, while in portrait mode 5 | width = 54 6 | left = 10 7 | top = 0 8 | bottom = 0 9 | right = 0 10 | orientation = landscape 11 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/staff/registration.txt: -------------------------------------------------------------------------------- 1 | Thank you for registering as staff. 2 | Your registration confirmation number is: {{reference}} 3 | If you have any questions about your registration, please contact your supervisor or {{ event.staffEmail }}. 4 | Thank you! 5 | -------------------------------------------------------------------------------- /registration/frontend/src/admin/scan/components/CloseButton.tsx: -------------------------------------------------------------------------------- 1 | import { Component } from "solid-js"; 2 | 3 | export const CloseButton: Component<{ close(): any }> = (props) => { 4 | return ( 5 | 6 | ); 7 | }; 8 | -------------------------------------------------------------------------------- /registration/resources/nametag/apis/apis.conf: -------------------------------------------------------------------------------- 1 | #Tested with Brother QL-570 2 | 3 | [default] 4 | zoom = 0.89 #;zoom factor 5 | height = 89 #;size of page in mm, while in portrait mode 6 | width = 28 7 | left = 0 8 | top = 0 9 | bottom = 0 10 | right = 0 11 | orientation = landscape 12 | -------------------------------------------------------------------------------- /registration/resources/nametag/apis/default.conf: -------------------------------------------------------------------------------- 1 | #Tested with Brother QL-570 2 | 3 | [default] 4 | zoom = 1 #;zoom factor 5 | height = 89 #;size of page in mm, while in portrait mode 6 | width = 28 7 | left = 5 8 | top = 0 9 | bottom = 0 10 | right = 0 11 | orientation = landscape 12 | -------------------------------------------------------------------------------- /registration/resources/nametag/fd_labels/furrydelphia-cr80.conf: -------------------------------------------------------------------------------- 1 | # CR-80 template 2 | [default] 3 | zoom = 1.22 #;zoom factor 4 | height = 85.6 #;size of page in mm, while in portrait mode 5 | width = 54 6 | left = 0 7 | top = 0 8 | bottom = 0 9 | right = 0 10 | orientation = landscape 11 | -------------------------------------------------------------------------------- /registration/resources/nametag/furrydelphia/furrydelphia.conf: -------------------------------------------------------------------------------- 1 | # CR-80 template 2 | [default] 3 | zoom = 1.22 #;zoom factor 4 | height = 85.4 #;size of page in mm, while in portrait mode 5 | width = 54 6 | left = 0 7 | top = 0 8 | bottom = 0 9 | right = 0 10 | orientation = landscape 11 | -------------------------------------------------------------------------------- /registration/static/site.webmanifest: -------------------------------------------------------------------------------- 1 | {"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} -------------------------------------------------------------------------------- /registration/templates/registration/customer-note.txt: -------------------------------------------------------------------------------- 1 | Reference: {{ reference }} 2 | {% for badge in result %}{{ badge.effectiveLevel.name }} - ${{ badge.level_total }}{% endfor %} 3 | Charity donation: ${{ charityDonation }} 4 | Organisation donation: ${{ orgDonation }} 5 | Total: ${{ total }} 6 | -------------------------------------------------------------------------------- /registration/resources/nametag/furrydelphia/furrydelphia-cr80.conf: -------------------------------------------------------------------------------- 1 | # CR-80 template 2 | [default] 3 | zoom = 1.22 #;zoom factor 4 | height = 85.6 #;size of page in mm, while in portrait mode 5 | width = 54 6 | left = 0 7 | top = 0 8 | bottom = 0 9 | right = 0 10 | orientation = landscape 11 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/dealer/assistant-form.txt: -------------------------------------------------------------------------------- 1 | {% load site %} 2 | 3 | Please use the link below to add additional assistants to your paid dealer registration. 4 | 5 | https://{% current_domain %}{% url 'registration:find_dealer_to_add_assistant' guid=dealer.registrationToken %} 6 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fm_eventmanager.settings") 7 | 8 | from django.core.management import execute_from_command_line 9 | 10 | execute_from_command_line(sys.argv) 11 | -------------------------------------------------------------------------------- /registration/tests/test_templates.py: -------------------------------------------------------------------------------- 1 | import unittest 2 | 3 | from django.core.management import call_command 4 | 5 | 6 | class TestTemplates(unittest.TestCase): 7 | def test_validate_templates(self): 8 | call_command("validate_templates") 9 | # This throws an error if it fails to validate 10 | -------------------------------------------------------------------------------- /registration/templates/admin/square_devices_list.html: -------------------------------------------------------------------------------- 1 | {% extends 'admin/change_list.html' %} 2 | 3 | {% block object-tools %} 4 | 9 | 10 | {{ block.super }} 11 | {% endblock %} 12 | -------------------------------------------------------------------------------- /registration/signals.py: -------------------------------------------------------------------------------- 1 | from django.db.models.signals import pre_save 2 | from django.dispatch import receiver 3 | 4 | from registration.models import Order 5 | 6 | 7 | @receiver(pre_save, sender=Order) 8 | def order_pre_save(sender, instance): 9 | if instance.billingState == None: 10 | instance.billingState = "" 11 | -------------------------------------------------------------------------------- /registration/tests/test_signals.py: -------------------------------------------------------------------------------- 1 | from unittest import TestCase 2 | 3 | from registration.models import Order 4 | 5 | 6 | class TestOrderPreSave(TestCase): 7 | def test_order_pre_save(self): 8 | order = Order(total=20, reference="FOOBAR") 9 | order.save() 10 | self.assertEqual(order.billingState, "") 11 | -------------------------------------------------------------------------------- /.isort.cfg: -------------------------------------------------------------------------------- 1 | [settings] 2 | known_third_party = configobj,django,django_u2f,freezegun,idempotency_key,import_export,influxdb,jwt,nested_inline,paho,pygments,pytz,qrcode,square 3 | multi_line_output = 3 4 | #forced_separate=django.contrib,django.utils 5 | include_trailing_comma = True 6 | force_grid_wrap=0 7 | use_parentheses=True 8 | line_length=80 9 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/staff/promotion.html: -------------------------------------------------------------------------------- 1 | {% load site %} 2 |

Welcome to {{event}} staff!

3 |

Use this link to register as staff: https://{% current_domain %}{% url 'registration:staff' guid=registrationToken %}

4 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/upgrade.txt: -------------------------------------------------------------------------------- 1 | Thank you for your upgrade! 2 | 3 | Your upgrade confirmation is: {{reference}} 4 | You my pick up your badge from the pre-reg line at the convention. 5 | If you have any questions regarding your registration, please contact {{ event.registrationEmail }}. 6 | 7 | See you at the convention! 8 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/staff/registration.html: -------------------------------------------------------------------------------- 1 |

Thank you for registering for {{ event }} staff

2 |

Your registration confirmation number is: {{reference}}

3 |

If you have any questions about your order, please contact your supervisor or {{ event.staffEmail }}.

4 |

Thank you!

5 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/dealer/assistant-register.txt: -------------------------------------------------------------------------------- 1 | {% load site %} 2 | Hello, {{assistant.name}}! 3 | 4 | Your sponsoring dealer, {{ assistant.dealer.businessName }}, has paid for your registration at {{event}}. 5 | 6 | Please use this link to register: https://{% current_domain %}{% url 'registration:dealer_asst' guid=assistant.registrationToken %} 7 | 8 | Thanks! 9 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/staff/new.txt: -------------------------------------------------------------------------------- 1 | {% load site %} 2 | Welcome to {{event.name}} Staff! 3 | If you have already registered as an attendee, do not use this form. Contact staff services to get a link to the correct registration form. 4 | Use this link to register as staff: https://{% current_domain %}{% url 'registration:new_staff' guid=registrationToken %} 5 | 6 | Signature 7 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/dealer/assistant-form.html: -------------------------------------------------------------------------------- 1 | {% load site %} 2 |

Please use the link below to add additional assistants to your paid dealer registration.

3 | 4 | https://{% current_domain %}{% url 'registration:find_dealer_to_add_assistant' guid=dealer.registrationToken %} 5 | -------------------------------------------------------------------------------- /registration/migrations/0066_merge_20180726_1722.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-07-26 21:22 3 | 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0065_auto_20180425_2022"), 12 | ("registration", "0060_priceleveloption_optionimage"), 13 | ] 14 | 15 | operations = [] 16 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/upgrade.html: -------------------------------------------------------------------------------- 1 |

Thank you for your upgrade!

2 |

Your upgrade confirmation is: {{reference}}

3 |

You my pick up your badge from the pre-reg line at the convention. If you have any questions regarding your registration, please contact {{event.registrationEmail}}.

4 |

See you at the convention!

5 |

 

6 |

{{event}} Registration

7 | -------------------------------------------------------------------------------- /registration/migrations/0081_merge_20181231_1518.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.17 on 2018-12-31 20:18 3 | 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0080_banlist_reason"), 12 | ("registration", "0069_auto_20180802_2118"), 13 | ("registration", "0080_cart"), 14 | ] 15 | 16 | operations = [] 17 | -------------------------------------------------------------------------------- /registration/migrations/0105_add_trigram_extensions_20241114_1419.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.25 on 2024-11-14 19:19 2 | 3 | from django.contrib.postgres.operations import TrigramExtension 4 | from django.db import migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('registration', '0104_add_event_website_url'), 11 | ] 12 | 13 | operations = [ 14 | TrigramExtension() 15 | ] 16 | -------------------------------------------------------------------------------- /registration/resources/nametag/apis/stylesheet.css: -------------------------------------------------------------------------------- 1 | /* Generated by Font Squirrel (https://www.fontsquirrel.com) on February 18, 2017 */ 2 | 3 | 4 | 5 | @font-face { 6 | font-family: 'computer_pixel-7regular'; 7 | src: url('http://localhost:8000/computer_pixel-7-webfont.woff2') format('woff2'), 8 | url('http://localhost:8000/computer_pixel-7-webfont.woff') format('woff'); 9 | font-weight: normal; 10 | font-style: normal; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /registration/resources/nametag/fd_labels/stylesheet.css: -------------------------------------------------------------------------------- 1 | /* Generated by Font Squirrel (https://www.fontsquirrel.com) on February 18, 2017 */ 2 | 3 | 4 | 5 | @font-face { 6 | font-family: 'computer_pixel-7regular'; 7 | src: url('http://localhost:8000/computer_pixel-7-webfont.woff2') format('woff2'), 8 | url('http://localhost:8000/computer_pixel-7-webfont.woff') format('woff'); 9 | font-weight: normal; 10 | font-style: normal; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /registration/resources/nametag/furrydelphia/stylesheet.css: -------------------------------------------------------------------------------- 1 | /* Generated by Font Squirrel (https://www.fontsquirrel.com) on February 18, 2017 */ 2 | 3 | 4 | 5 | @font-face { 6 | font-family: 'computer_pixel-7regular'; 7 | src: url('http://localhost:8000/computer_pixel-7-webfont.woff2') format('woff2'), 8 | url('http://localhost:8000/computer_pixel-7-webfont.woff') format('woff'); 9 | font-weight: normal; 10 | font-style: normal; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /registration/templates/registration/dealer/dealer-update.html: -------------------------------------------------------------------------------- 1 | {% extends "registration/master.html" %} 2 | 3 | {% block content %} 4 |
5 |
6 |

Dealer Registration - {{ event }}

7 |

Thank you for updating your information!

8 |

Back to Main Page

9 |
10 |
11 | {% endblock %} 12 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/upgrade-instructions.txt: -------------------------------------------------------------------------------- 1 | {% load site %} 2 | Upgrade your {{event}} registration 3 | 4 | To upgrade your registration, please follow this link: 5 | https://{% current_domain %}{% url 'registration:upgrade' guid=badge.registrationToken %} 6 | 7 | If you have any questions regarding your registration, please contact {{event.registrationEmail}} 8 | 9 | See you at the convention! 10 | 11 | -- 12 | 13 | {{event}} Registration 14 | -------------------------------------------------------------------------------- /registration/static/admin/js/jquery.init.js: -------------------------------------------------------------------------------- 1 | /*global jQuery:false*/ 2 | 'use strict'; 3 | /* Puts the included jQuery into our own namespace using noConflict and passing 4 | * it 'true'. This ensures that the included jQuery doesn't pollute the global 5 | * namespace (i.e. this preserves pre-existing values for both window.$ and 6 | * window.jQuery). 7 | */ 8 | window.django = {jQuery: jQuery.noConflict(true)}; 9 | window.jQuery = window.django.jQuery; 10 | window.$ = jQuery; -------------------------------------------------------------------------------- /registration/migrations/0020_remove_dealer_extratable.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-10-13 23:37 3 | 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0019_auto_20161013_1813"), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name="dealer", 17 | name="extraTable", 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /registration/templatetags/settings.py: -------------------------------------------------------------------------------- 1 | # Make attributes from settings.py available to templates 2 | 3 | from django import template 4 | from django.conf import settings 5 | 6 | register = template.Library() 7 | 8 | 9 | @register.simple_tag 10 | def settings_value(name): 11 | return getattr(settings, name, "") 12 | 13 | 14 | @register.simple_tag 15 | def settings_value_bool(name): 16 | setting = getattr(settings, name, False) 17 | if setting: 18 | return "true" 19 | return "false" 20 | -------------------------------------------------------------------------------- /DockerfileBase: -------------------------------------------------------------------------------- 1 | FROM tiangolo/uwsgi-nginx:python3.11 2 | 3 | COPY ./requirements.txt /app 4 | 5 | WORKDIR /app 6 | 7 | RUN apt-get update && apt-get -y install python3-psycopg2 ca-certificates xfonts-75dpi xfonts-base 8 | RUN wget -nv https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6.1-3/wkhtmltox_0.12.6.1-3.bullseye_amd64.deb 9 | RUN dpkg -i wkhtmltox_0.12.6.1-3.bullseye_amd64.deb 10 | RUN apt-get -y -f install 11 | 12 | RUN pip install --upgrade pip 13 | RUN pip install -r requirements.txt 14 | -------------------------------------------------------------------------------- /registration/migrations/0093_add_dealerasst_paid.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.25 on 2021-12-21 07:25 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ("registration", "0092_dealer_asst_discount"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name="dealerasst", 15 | name="paid", 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/staff/new.html: -------------------------------------------------------------------------------- 1 | {% load site %} 2 |

Welcome to {{event.name}} staff!

3 |

If you have already registered as an attendee, do not use this form. Please contact staff services to get the correct registration link.

4 |

Use this link to register as staff: https://{% current_domain %}{% url 'registration:new_staff' guid=registrationToken %}

5 |

 

6 |

Signature

7 | -------------------------------------------------------------------------------- /templates/registration/logged_out.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base_site.html" %} 2 | {% load i18n %} 3 | 4 | {% block breadcrumbs %}{% endblock %} 5 | 6 | {% block nav-sidebar %}{% endblock %} 7 | 8 | {% block content %} 9 | 10 |

{% translate "Thanks for spending some quality time in this esteemed place of honor." %}

11 | 12 |

{% translate 'Log in again' %}

13 | 14 | {% endblock %} 15 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/dealer/assistant-register.html: -------------------------------------------------------------------------------- 1 | {% load site %} 2 |

Hello, {{assistant.name}}!

3 | 4 |

Your sponsoring dealer, {{ assistant.dealer.businessName }}, has paid for your registration at {{event}}.

5 | 6 |

Please use this link to register: https://{% current_domain %}{% url 'registration:dealer_asst' guid=assistant.registrationToken %}

7 | 8 |

Thanks!

9 | -------------------------------------------------------------------------------- /registration/migrations/0099_webhook_completed.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-02-27 02:42 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ("registration", "0098_auto_20230124_2055"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name="paymentwebhooknotification", 15 | name="processed", 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /registration/static/js/main-init-sentry.js: -------------------------------------------------------------------------------- 1 | if (SENTRY_ENABLED) { 2 | Sentry.init({ 3 | dsn: SENTRY_FRONTEND_DSN, 4 | environment: SENTRY_ENVIRONMENT, 5 | release: SENTRY_RELEASE, 6 | beforeSend(event, hint) { 7 | // Check if it is an exception, and if so, show the report dialog 8 | if (SENTRY_USER_REPORTS && event.exception) { 9 | Sentry.showReportDialog({eventId: event.event_id}); 10 | } 11 | return event; 12 | }, 13 | }); 14 | } -------------------------------------------------------------------------------- /registration/migrations/0029_dealer_emailed.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-12-17 18:43 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0028_order_status"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="dealer", 17 | name="emailed", 18 | field=models.BooleanField(default=False), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0033_discount_used.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-12-23 22:40 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0032_auto_20161223_1732"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="discount", 17 | name="used", 18 | field=models.IntegerField(default=0), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0080_banlist_reason.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2018-12-14 23:55 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0079_pricelevel_isminor"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="banlist", 17 | name="reason", 18 | field=models.TextField(blank=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /fm_eventmanager/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for fm_eventmanager 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.9/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | import sys 12 | 13 | from django.core.wsgi import get_wsgi_application 14 | 15 | sys.path.append("/home/apis/APIS/") 16 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fm_eventmanager.settings") 17 | 18 | application = get_wsgi_application() 19 | -------------------------------------------------------------------------------- /fm_eventmanager/wsgi_docker.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for fm_eventmanager 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.9/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | import sys 12 | 13 | from django.core.wsgi import get_wsgi_application 14 | 15 | sys.path.append("/app/") 16 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fm_eventmanager.settings") 17 | 18 | application = get_wsgi_application() 19 | -------------------------------------------------------------------------------- /registration/migrations/0038_auto_20170128_1001.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2017-01-28 15:01 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0037_auto_20161230_1154"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name="jersey", 17 | name="number", 18 | field=models.CharField(max_length=3), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0059_attendee_aslrequest.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2017-12-03 23:28 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0058_banlist"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="attendee", 17 | name="aslRequest", 18 | field=models.BooleanField(default=False), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0064_event_default.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-04-25 22:45 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0063_auto_20180419_0210"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="event", 17 | name="default", 18 | field=models.BooleanField(default=False), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0069_temptoken_sent.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-07-14 03:04 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0068_auto_20180512_2104"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="temptoken", 17 | name="sent", 18 | field=models.BooleanField(default=False), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0074_staff_checkedin.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-07-24 23:59 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0073_dealerasst_event"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="staff", 17 | name="checkedIn", 18 | field=models.BooleanField(default=False), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0075_dealer_logo.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-07-25 00:08 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0074_staff_checkedin"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="dealer", 17 | name="logo", 18 | field=models.CharField(blank=True, max_length=500), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0041_auto_20170217_1825.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2017-02-17 23:25 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0040_staffjersey"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name="attendee", 17 | name="registeredDate", 18 | field=models.DateTimeField(null=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0042_attendee_printed.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2017-03-07 00:34 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0041_auto_20170217_1825"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="attendee", 17 | name="printed", 18 | field=models.BooleanField(default=False), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0045_order_lastfour.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2017-03-27 23:50 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0044_auto_20170316_2219"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="order", 17 | name="lastFour", 18 | field=models.CharField(blank=True, max_length=4), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0050_attendee_surveyok.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2017-05-19 00:07 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0049_auto_20170511_2106"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="attendee", 17 | name="surveyOk", 18 | field=models.BooleanField(default=False), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0028_order_status.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-12-08 01:37 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0027_auto_20161104_2004"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="order", 17 | name="status", 18 | field=models.CharField(default="Pending", max_length=50), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0056_dealer_asstbreakfast.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2017-10-15 15:24 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0055_auto_20171009_1134"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="dealer", 17 | name="asstBreakfast", 18 | field=models.BooleanField(default=False), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/upgrade-instructions.html: -------------------------------------------------------------------------------- 1 | {% load site %} 2 |

Upgrade your {{event}} registration

3 |

To upgrade your registration, follow this link: Upgrade your registration

4 |

If you have any questions regarding your registration, please contact {{event.registrationEmail}}.

5 |

See you at the convention!

6 |

 

7 |

{{event}} Registration

8 | -------------------------------------------------------------------------------- /registration/migrations/0002_auto_20160726_2342.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-07-26 23:42 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0001_initial"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name="attendee", 17 | name="volunteerDepts", 18 | field=models.CharField(blank=True, max_length=1000), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0076_event_allowonlineminorreg.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-07-31 01:18 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0075_dealer_logo"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="event", 17 | name="allowOnlineMinorReg", 18 | field=models.BooleanField(default=False), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0077_priceleveloption_rank.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-08-25 16:23 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0076_event_allowonlineminorreg"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="priceleveloption", 17 | name="rank", 18 | field=models.IntegerField(default=0), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/static/js/_site/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /registration/migrations/0016_priceleveloption_required.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-10-06 00:53 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0015_auto_20160926_1927"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="priceleveloption", 17 | name="required", 18 | field=models.BooleanField(default=False), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0026_dealer_buttonoffer.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-11-03 00:42 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0025_tablesize_baseprice"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="dealer", 17 | name="buttonOffer", 18 | field=models.CharField(blank=True, max_length=200), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0062_auto_20180416_0020.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-04-16 04:20 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0061_cashdrawer_firebase"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name="firebase", 17 | name="token", 18 | field=models.CharField(max_length=500, unique=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0068_auto_20180512_2104.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-05-13 01:04 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0067_auto_20180512_2055"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name="temptoken", 17 | name="usedDate", 18 | field=models.DateTimeField(blank=True, null=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0079_pricelevel_isminor.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-10-01 21:38 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0078_priceleveloption_description"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="pricelevel", 17 | name="isMinor", 18 | field=models.BooleanField(default=False), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/migrations/0107_mqtt_printing_per_terminal.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.25 on 2025-03-05 03:35 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ("registration", "0106_add_badge_templates"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name="firebase", 15 | name="print_via_mqtt", 16 | field=models.BooleanField(default=False, verbose_name='Print via MQTT'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /registration/migrations/0078_priceleveloption_description.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-08-25 16:44 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0077_priceleveloption_rank"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="priceleveloption", 17 | name="description", 18 | field=models.TextField(blank=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/templates/registration/staff/staff-done.html: -------------------------------------------------------------------------------- 1 | {% extends "registration/master.html" %} 2 | 3 | {% block content %} 4 |
5 |
6 |

Staff Registration - {{ event }}

7 |

Thank you for registering!

8 |
9 |

You should receive an email shortly with your confirmation number. See you at the con!

10 |

Back to Main Page

11 |
12 |
13 | {% endblock %} 14 | -------------------------------------------------------------------------------- /registration/migrations/0025_tablesize_baseprice.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-11-02 13:21 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0024_auto_20161020_1910"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="tablesize", 17 | name="basePrice", 18 | field=models.DecimalField(decimal_places=2, default=0, max_digits=6), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/templates/admin/copy_event.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base_site.html" %} 2 | 3 | {% block content %} 4 | 5 |

This form will copy the selected staff into an existing event.

6 | 7 |

Select an event:

8 | 9 |
10 | 11 | {{ form }} 12 | 13 |

The staff to be copied:

14 | 15 | 16 | 17 | 18 | {% csrf_token %} 19 | 20 |
21 | 22 | {% endblock %} 23 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/dealer/dealer-notice.txt: -------------------------------------------------------------------------------- 1 | {% load site %} 2 | {% autoescape off %} 3 | A dealer has registered: 4 | 5 | Name: {{dealer.attendee.firstName}} {{dealer.attendee.lastName}} 6 | Email: {{dealer.attendee.email}} 7 | 8 | Business Name: {{dealer.businessName}} 9 | Business Website: {{dealer.website}} 10 | Description of Wares: {{dealer.description}} 11 | 12 | Requested Table Size: {{dealer.tableSize}} 13 | 14 | View the full dealer record: https://{% current_domain %}{% url 'admin:registration_dealer_change' dealer.id %} 15 | {% endautoescape %} 16 | -------------------------------------------------------------------------------- /registration/migrations/0068_auto_20180802_2110.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-08-03 01:10 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0067_auto_20180802_2106"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name="cashdrawer", 17 | name="tendered", 18 | field=models.DecimalField(decimal_places=2, max_digits=8, null=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/dealer/dealer.txt: -------------------------------------------------------------------------------- 1 | {% autoescape off %} 2 | Thank you for your application to be a dealer at {{ event }}. 3 | 4 | The cut off date for primary applicants will be {{ event.dealerRegEnd|date:'l, F jS, Y H:i' }}, and selections will be 5 | made at that time. 6 | 7 | If you have any questions, please feel free to contact us: {{ event.dealerEmail }} 8 | 9 | If you have listed any assistants, they will receive an email with instructions about how to register after your 10 | payment has been received. 11 | 12 | Thank you! 13 | {% endautoescape %} 14 | -------------------------------------------------------------------------------- /templates/503.html: -------------------------------------------------------------------------------- 1 | {% extends "registration/utility_pages.html" %} 2 | {% load static %} 3 | 4 | {% block content %} 5 |
6 |
7 |

503

8 |

Sorry, we're down for maintenance

9 | 10 | 11 |

12 | We'll be back up shortly. Thank you for your patience.
13 | (Service Temporarily Unavailable) 14 |

15 | 16 |
17 |
18 | {% endblock %} 19 | -------------------------------------------------------------------------------- /registration/templates/registration/upgrade-done.html: -------------------------------------------------------------------------------- 1 | {% extends "registration/master.html" %} 2 | 3 | {% block content %} 4 |
5 |
6 |

Registration - {{ event }}

7 |

Thank you for your upgrade!

8 |
9 |

Thank you for upgrading your registration!

10 |

You should receive an email confirmation shortly. See you at the con!

11 |

Back to Main Page

12 |
13 |
14 | {% endblock %} 15 | -------------------------------------------------------------------------------- /templates/u2f/base.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% load static %} 3 | {% load i18n %} 4 | 5 | {% block content %} 6 | {{ block.super }} 7 | 8 | 18 | {% endblock %} 19 | -------------------------------------------------------------------------------- /registration/frontend/src/admin/scan/components/MismatchedData.tsx: -------------------------------------------------------------------------------- 1 | import { Component, JSX, Show } from "solid-js"; 2 | 3 | export const MismatchedData: Component<{ 4 | matched: boolean; 5 | message: string; 6 | children: JSX.Element; 7 | }> = (props) => { 8 | return ( 9 | 10 | 11 | 12 | 13 | 14 | {props.children} 15 | 16 | 17 | ); 18 | }; 19 | -------------------------------------------------------------------------------- /registration/templates/registration/done.html: -------------------------------------------------------------------------------- 1 | {% extends "registration/master.html" %} 2 | 3 | {% block content %} 4 |
5 |
6 |

Registration - {{ event }}

7 |

Thank you for your Payment!

8 |
9 |

Thank you for registering!

10 |

You should receive an email shortly with your confirmation number. See you at the con!

11 |

Back to Main Page

12 |


13 |
14 |
15 | {% endblock %} 16 | -------------------------------------------------------------------------------- /registration/frontend/src/admin/scan/components/UrlEntry.tsx: -------------------------------------------------------------------------------- 1 | import { Component } from "solid-js"; 2 | 3 | import { CloseButton } from "./CloseButton"; 4 | 5 | export const UrlEntry: Component<{ url: string; remove(): void }> = (props) => { 6 | return ( 7 | 19 | ); 20 | }; 21 | -------------------------------------------------------------------------------- /registration/frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "@fortawesome/fontawesome-free": "^7.1.0", 4 | "@kobalte/core": "^0.13.11", 5 | "@sentry/solid": "^10.20.0", 6 | "@solid-primitives/keyboard": "^1.3.3", 7 | "big.js": "^7.0.1", 8 | "bulma": "^1.0.4", 9 | "date-fns": "^4.1.0", 10 | "esbuild": "^0.25.11", 11 | "esbuild-plugin-solid": "^0.6.0", 12 | "esbuild-sass-plugin": "^3.3.1", 13 | "mitt": "^3.0.1", 14 | "mqtt": "^5.14.1", 15 | "solid-js": "^1.9.9" 16 | }, 17 | "devDependencies": { 18 | "@types/big.js": "^6.2.2", 19 | "typescript": "^5.9.3" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/dealer/dealer-approval.txt: -------------------------------------------------------------------------------- 1 | {% load site %} 2 | {% autoescape off %} 3 | Your dealer application for {{ dealer.event }} has been approved! 4 | 5 | Please go to the url below and enter the email address you used to register. 6 | https://{% current_domain %}{% url 'registration:dealers' guid=dealer.registrationToken %} 7 | 8 | You will receive an email with a confirmation number after submitting your payment. 9 | If you have any further questions, please feel free to contact us: {{ dealer.event.dealerEmail }} 10 | 11 | Thank you and welcome to the {{ dealer.event }} Dealer's Den! 12 | {% endautoescape %} 13 | -------------------------------------------------------------------------------- /registration/migrations/0104_add_event_website_url.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.25 on 2025-01-11 03:07 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('registration', '0103_auto_20241109_1543'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='event', 16 | name='websiteUrl', 17 | field=models.CharField(blank=True, help_text="URL to the homepage for the convention's primary website.", max_length=500, verbose_name='Website URL'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /registration/resources/nametag/apis/generator_config.txt: -------------------------------------------------------------------------------- 1 | # Font Squirrel Font-face Generator Configuration File 2 | # Upload this file to the generator to recreate the settings 3 | # you used to create these fonts. 4 | 5 | {"mode":"optimal","formats":["woff","woff2"],"tt_instructor":"default","fix_gasp":"xy","fix_vertical_metrics":"Y","metrics_ascent":"","metrics_descent":"","metrics_linegap":"","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","subset_ot_features_list":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"} 6 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/registration.txt: -------------------------------------------------------------------------------- 1 | Thank you for registering for {{ event }}! 2 | 3 | Your order number is: {{reference}} 4 | Your badge name is: {{orderItem.badge.badgeName}} 5 | Your attending level is: {{orderItem.priceLevel.name}} 6 | 7 | This email is for your records only. You will not need the confirmation number to pick up your badge. In order to pick up your badge on-site, you will only need to bring your Government Issued Photo ID to the registration desk. 8 | If you have any questions regarding your registration, please contact {{ event.registrationEmail }}. 9 | 10 | See you there! 11 | 12 | - {{ event }} Registration Team 13 | -------------------------------------------------------------------------------- /registration/resources/nametag/fd_labels/generator_config.txt: -------------------------------------------------------------------------------- 1 | # Font Squirrel Font-face Generator Configuration File 2 | # Upload this file to the generator to recreate the settings 3 | # you used to create these fonts. 4 | 5 | {"mode":"optimal","formats":["woff","woff2"],"tt_instructor":"default","fix_gasp":"xy","fix_vertical_metrics":"Y","metrics_ascent":"","metrics_descent":"","metrics_linegap":"","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","subset_ot_features_list":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"} 6 | -------------------------------------------------------------------------------- /registration/resources/nametag/furrydelphia/generator_config.txt: -------------------------------------------------------------------------------- 1 | # Font Squirrel Font-face Generator Configuration File 2 | # Upload this file to the generator to recreate the settings 3 | # you used to create these fonts. 4 | 5 | {"mode":"optimal","formats":["woff","woff2"],"tt_instructor":"default","fix_gasp":"xy","fix_vertical_metrics":"Y","metrics_ascent":"","metrics_descent":"","metrics_linegap":"","add_spaces":"Y","add_hyphens":"Y","fallback":"none","fallback_custom":"100","options_subset":"basic","subset_custom":"","subset_custom_range":"","subset_ot_features_list":"","css_stylesheet":"stylesheet.css","filename_suffix":"-webfont","emsquare":"2048","spacing_adjustment":"0"} 6 | -------------------------------------------------------------------------------- /registration/migrations/0030_auto_20161221_1121.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-12-21 16:21 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0029_dealer_emailed"), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name="orderitem", 17 | name="confirmationCode", 18 | ), 19 | migrations.AddField( 20 | model_name="pricelevel", 21 | name="group", 22 | field=models.TextField(blank=True), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /registration/migrations/0060_priceleveloption_optionimage.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-06-18 16:26 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | import registration.models 8 | 9 | 10 | class Migration(migrations.Migration): 11 | 12 | dependencies = [ 13 | ("registration", "0059_attendee_aslrequest"), 14 | ] 15 | 16 | operations = [ 17 | migrations.AddField( 18 | model_name="priceleveloption", 19 | name="optionImage", 20 | field=models.ImageField( 21 | blank=True, null=True, upload_to=registration.models.content_file_name 22 | ), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /registration/migrations/0087_onsite_reg_start.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.17 on 2020-02-17 09:00 3 | 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0086_rename_tables"), 12 | ] 13 | 14 | operations = [ 15 | migrations.RenameField( 16 | model_name="event", 17 | old_name="onlineRegEnd", 18 | new_name="onsiteRegEnd", 19 | ), 20 | migrations.RenameField( 21 | model_name="event", 22 | old_name="onlineRegStart", 23 | new_name="onsiteRegStart", 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /registration/migrations/0091_alter_firebase_webview.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-11-22 02:47 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ("registration", "0090_auto_20201214_2222"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name="firebase", 15 | name="webview", 16 | field=models.CharField( 17 | blank=True, 18 | default="https://www.example.com/code-of-conduct-embed/", 19 | max_length=500, 20 | null=True, 21 | ), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /registration/templates/registration/closed.html: -------------------------------------------------------------------------------- 1 | {% extends "registration/master.html" %} 2 | 3 | {% block content %} 4 |
5 |
6 |

Registration - {{ event }}

7 |
8 |

Registration for {{ event }} {{ message }}

9 | 17 |
18 |
19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /registration/migrations/0005_auto_20160806_1650.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-08-06 16:50 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0004_auto_20160729_0021"), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name="orderitem", 18 | name="priceLevel", 19 | field=models.OneToOneField( 20 | on_delete=django.db.models.deletion.CASCADE, 21 | to="registration.PriceLevel", 22 | ), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | app: 3 | image: ghcr.io/furthemore/apis:latest 4 | build: . 5 | restart: always 6 | ports: 7 | - 8080:80 8 | - 8000:8000 9 | volumes: 10 | - ./registration:/app/registration 11 | - ./fm_eventmanager/settings.py.docker:/app/fm_eventmanager/settings.py 12 | env_file: 13 | - .env 14 | depends_on: 15 | - postgres 16 | - redis 17 | 18 | postgres: 19 | image: postgres 20 | restart: always 21 | env_file: 22 | - database.env 23 | volumes: 24 | - database-data:/var/lib/postgresql/data 25 | 26 | redis: 27 | image: redis 28 | restart: always 29 | 30 | volumes: 31 | database-data: 32 | -------------------------------------------------------------------------------- /registration/migrations/0067_auto_20180512_2055.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-05-13 00:55 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0066_temptoken"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name="temptoken", 17 | name="usedDate", 18 | field=models.DateTimeField(null=True), 19 | ), 20 | migrations.AlterField( 21 | model_name="temptoken", 22 | name="validUntil", 23 | field=models.DateTimeField(), 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /registration/migrations/0049_auto_20170511_2106.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2017-05-12 01:06 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0048_auto_20170511_2022"), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name="pricelevel", 17 | name="priceLevelOptions", 18 | ), 19 | migrations.AddField( 20 | model_name="pricelevel", 21 | name="priceLevelOptions", 22 | field=models.ManyToManyField(to="registration.PriceLevelOption"), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /registration/migrations/0023_auto_20161020_1843.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-10-20 22:43 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0022_auto_20161020_1832"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="tablesize", 17 | name="partnerMax", 18 | field=models.IntegerField(default=1), 19 | ), 20 | migrations.AddField( 21 | model_name="tablesize", 22 | name="partnerMin", 23 | field=models.IntegerField(default=1), 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /registration/migrations/0039_auto_20170129_1410.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2017-01-29 19:10 3 | 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0038_auto_20170128_1001"), 12 | ] 13 | 14 | operations = [ 15 | # Removing columns isn't possible with sqlite backend: 16 | # https://github.com/miguelgrinberg/Flask-Migrate/issues/17 17 | # migrations.RemoveField( 18 | # model_name='staffjersey', 19 | # name='jersey_ptr', 20 | # ), 21 | migrations.DeleteModel( 22 | name="StaffJersey", 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /registration/migrations/0051_orderitem_badge.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2017-05-19 02:01 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0050_attendee_surveyok"), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name="orderitem", 18 | name="badge", 19 | field=models.ForeignKey( 20 | null=True, 21 | on_delete=django.db.models.deletion.CASCADE, 22 | to="registration.Badge", 23 | ), 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /registration/migrations/0007_auto_20160821_1554.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-08-21 15:54 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0006_auto_20160806_1733"), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name="orderitem", 18 | name="order", 19 | field=models.ForeignKey( 20 | null=True, 21 | on_delete=django.db.models.deletion.CASCADE, 22 | to="registration.Order", 23 | ), 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /registration/migrations/0021_auto_20161013_1941.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-10-13 23:41 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0020_remove_dealer_extratable"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="tablesize", 17 | name="chairMax", 18 | field=models.IntegerField(default=1), 19 | ), 20 | migrations.AddField( 21 | model_name="tablesize", 22 | name="chairMin", 23 | field=models.IntegerField(default=1), 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/dealer/dealer.html: -------------------------------------------------------------------------------- 1 |

Thank you for your application to be a dealer at {{ event }}

2 |

The cut off date for primary applicants will be {{ event.dealerRegEnd|date:'l, F jS, Y H:i' }}, and selections will 3 | be made at that time.

4 |

If you have not received an acceptance notification by that date, you will be placed on the waitlist for an available 5 | spot. If you have any questions, please feel free to contact us: {{event.dealerEmail}} 6 |

7 |

If you have listed any assistants, they will receive an email with instructions about how to register after your 8 | payment has been received.

9 |

Thank you!

10 | -------------------------------------------------------------------------------- /registration/templates/registration/staff/staff-closed.html: -------------------------------------------------------------------------------- 1 | {% extends "registration/master.html" %} 2 | 3 | {% block content %} 4 |
5 |
6 |

Staff Registration - {{ event }}

7 |
8 |

Staff Registration for {{ event }} {{ message }}

9 | 17 |
18 |
19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /registration/migrations/0009_auto_20160821_1340.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-08-21 17:40 3 | 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0008_auto_20160821_1600"), 12 | ] 13 | 14 | operations = [ 15 | migrations.RenameField( 16 | model_name="attendeeoptions", 17 | old_name="optionExtraValue", 18 | new_name="optionValue", 19 | ), 20 | migrations.RenameField( 21 | model_name="priceleveloption", 22 | old_name="OptionExtraType", 23 | new_name="optionExtraType", 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /registration/templates/registration/dealer/dealer-closed.html: -------------------------------------------------------------------------------- 1 | {% extends "registration/master.html" %} 2 | 3 | {% block content %} 4 |
5 |
6 |

Dealer Registration - {{ event }}

7 |
8 |

Dealer registration for {{ event }} {{ message }}

9 | 17 |
18 |
19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/dealer/dealer-notice.html: -------------------------------------------------------------------------------- 1 | {% load site %} 2 |

A dealer has registered:

3 | 4 |

5 | Name: {{dealer.attendee.firstName}} {{dealer.attendee.lastName}}
6 | Email: {{dealer.attendee.email}} 7 |

8 | 9 |

10 | Business Name: {{dealer.businessName}} 11 | Business Website: {{dealer.website}} 12 | Description of Wares: {{dealer.description}} 13 |

14 |

15 | Requested Table Size: {{dealer.tableSize}} 16 |

17 |

18 | View the full dealer 19 | record 20 |

21 | -------------------------------------------------------------------------------- /registration/migrations/0015_auto_20160926_1927.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-09-26 23:27 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0014_auto_20160926_1925"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name="dealer", 17 | name="farFrom", 18 | field=models.CharField(blank=True, max_length=200), 19 | ), 20 | migrations.AlterField( 21 | model_name="dealer", 22 | name="nearTo", 23 | field=models.CharField(blank=True, max_length=200), 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /registration/migrations/0073_dealerasst_event.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-07-22 01:19 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0072_dealerasst"), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name="dealerasst", 18 | name="event", 19 | field=models.ForeignKey( 20 | blank=True, 21 | null=True, 22 | on_delete=django.db.models.deletion.SET_NULL, 23 | to="registration.Event", 24 | ), 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /registration/migrations/0100_webhook_type.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-03-08 22:15 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('registration', '0099_webhook_completed'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='paymentwebhooknotification', 15 | name='event_type', 16 | field=models.CharField(default='', max_length=50), 17 | ), 18 | migrations.AlterField( 19 | model_name='firebase', 20 | name='token', 21 | field=models.CharField(help_text="Use 'none' to disable push", max_length=500), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /registration/templates/registration/docs/no-event.html: -------------------------------------------------------------------------------- 1 | {% extends "registration/master.html" %} 2 | 3 | {% block content %} 4 |
5 |
6 |

Welcome

7 |
8 |

9 | APIS has been successfully set up, but no default event was found. 10 | APIS uses the values of the default event to control how these pages work, 11 | and what time each page should be available. 12 |

13 |

14 | To get started, please add an event 15 | and set it as the default in the admin panel. 16 |

17 |
18 |
19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /templates/admin/registration/firebase/change_form.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/change_form.html" %} 2 | {% load i18n admin_urls %} 3 | {% block object-tools-items %} 4 | {% if user.is_superuser %} 5 |
  • 6 | Provision App 7 |
  • 8 | {% endif %} 9 | 10 |
  • 11 | {% trans "History" %} 12 |
  • 13 | {% if has_absolute_url %} 14 |
  • 15 | {% trans "View on site" %} 16 |
  • 17 | {% endif %} 18 | {% endblock %} 19 | -------------------------------------------------------------------------------- /registration/migrations/0057_tablesize_event.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2017-10-19 23:55 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0056_dealer_asstbreakfast"), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name="tablesize", 18 | name="event", 19 | field=models.ForeignKey( 20 | blank=True, 21 | null=True, 22 | on_delete=django.db.models.deletion.SET_NULL, 23 | to="registration.Event", 24 | ), 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /registration/migrations/0097_temptoken_ignore_time_window.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.16 on 2023-01-19 08:06 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('registration', '0096_square_webhooks'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='temptoken', 15 | name='ignore_time_window', 16 | field=models.BooleanField(default=False, help_text='Enabling this option will allow this invite code to disregard the open and close date and time specified in the event. The Valid Until setting on this form will still apply', verbose_name='Ignore Registration Time Window'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /registration/migrations/0027_auto_20161104_2004.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-11-05 00:04 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0026_dealer_buttonoffer"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="dealer", 17 | name="discount", 18 | field=models.DecimalField(decimal_places=2, default=0.0, max_digits=6), 19 | ), 20 | migrations.AddField( 21 | model_name="dealer", 22 | name="discountReason", 23 | field=models.CharField(blank=True, max_length=200), 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | __pycache__/ 3 | fm_eventmanager/dev.py 4 | fm_eventmanager/settings.py 5 | fm_eventmanager/settings.py.bak 6 | ^static/ 7 | venv/ 8 | db.sqlite3 9 | test-db.sqlite3 10 | test-db.sqlite3-journal 11 | registration/resources/nametag/apis/tmp*.html 12 | .idea/ 13 | .coverage 14 | .envrc 15 | fm_eventmanager/maintenance_mode_state.txt 16 | localhost.crt 17 | localhost.key 18 | venv3/ 19 | .env 20 | htmlcov/ 21 | .DS_Store 22 | pgdb/ 23 | node_modules/ 24 | .python-version 25 | /registration/frontend/metafile.json 26 | /registration/static/admin.css 27 | /registration/static/admin.css.map 28 | /registration/static/admin.js 29 | /registration/static/admin.js.map 30 | /registration/static/fa-solid-900-5ZUYHGA7.woff2 31 | /registration/static/fa-solid-900-PJNKLK6W.ttf 32 | -------------------------------------------------------------------------------- /registration/templates/registration/dealer/dealerasst-done.html: -------------------------------------------------------------------------------- 1 | {% extends "registration/master.html" %} 2 | 3 | {% block content %} 4 |
    5 |
    6 |

    Dealer Partners - {{ event }}

    7 |

    Thank you for your Marketplace Payment!

    8 |
    9 |

    Salutations Vendor,

    10 |

    Thank you for adding a dealer partner to your order. If you have any questions or concerns, please email {{ event.dealerEmail }}.

    12 |

    Back to Main Page

    13 |

    You should be receiving an email confirmation shortly.

    14 |
    15 |
    16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/dealer/dealer-approval.html: -------------------------------------------------------------------------------- 1 | {% load site %} 2 |

    Your dealer application for {{ dealer.event }} has been approved!

    3 |

    Please go to the url below and enter the email address you used to register.

    4 |

    5 | https://{%current_domain %}{% url 'registration:dealers' guid=dealer.registrationToken %}

    6 |

    You will receive an email with a confirmation number after submitting your payment. If you have any further 7 | questions, please feel free to contact us: {{ dealer.event.dealerEmail }} 8 |

    9 |

    Thank you and welcome to the {{ dealer.event }} Dealer's Den!

    10 | -------------------------------------------------------------------------------- /registration/templates/registration/onsite-admin.html: -------------------------------------------------------------------------------- 1 | {% load static settings %} 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | APIS Register 12 | 13 | 14 | 15 | 16 | 19 | 20 | {% block head %}{% endblock %} 21 | 22 | 23 | 24 | 25 |
    26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /registration/templates/registration/onsite-done.html: -------------------------------------------------------------------------------- 1 | {% extends "registration/master.html" %} 2 | 3 | {% block content %} 4 |
    5 |
    6 |

    Registration - {{ event }}

    7 |

    Thank you for your registering!

    8 |
    9 |

    Please wait for the next available cashier to pay and pick up your badge.

    10 |

    Start a new registration

    11 |
    12 |
    13 | {% endblock %} 14 | 15 | {% block javascript %} 16 | 21 | 22 | {% endblock %} 23 | -------------------------------------------------------------------------------- /registration/frontend/src/admin/index.scss: -------------------------------------------------------------------------------- 1 | @use "bulma/sass"; 2 | @use "bulma/sass/utilities/mixins"; 3 | 4 | @use "@fortawesome/fontawesome-free/scss/variables.scss" with ( 5 | $font-path: "@fortawesome/fontawesome-free/webfonts" 6 | ); 7 | @use "@fortawesome/fontawesome-free/scss/fontawesome.scss"; 8 | @use "@fortawesome/fontawesome-free/scss/solid.scss"; 9 | 10 | .has-text-nowrap { 11 | text-wrap: nowrap; 12 | } 13 | 14 | .attendee-table { 15 | width: 100%; 16 | max-height: max(50vh, 500px); 17 | overflow-y: auto; 18 | 19 | border-end-start-radius: var(--bulma-panel-radius); 20 | border-end-end-radius: var(--bulma-panel-radius); 21 | } 22 | 23 | .badge-name { 24 | word-break: break-word; 25 | } 26 | 27 | @include mixins.tablet { 28 | .badge-actions { 29 | flex-wrap: nowrap; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /registration/migrations/0046_auto_20170427_1003.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2017-04-27 14:03 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0045_order_lastfour"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterModelOptions( 16 | name="attendeeonsite", 17 | options={ 18 | "verbose_name": "Attendee Onsite 2017", 19 | "verbose_name_plural": "Attendee Onsite 2017", 20 | }, 21 | ), 22 | migrations.AddField( 23 | model_name="priceleveloption", 24 | name="active", 25 | field=models.BooleanField(default=False), 26 | ), 27 | ] 28 | -------------------------------------------------------------------------------- /registration/static/js/templates/staff.js: -------------------------------------------------------------------------------- 1 | shirtSizes = []; 2 | 3 | $("body").ready(function () { 4 | $.getJSON("/registration/shirts", function (data) { 5 | $.each(data, function (key, val) { 6 | $("#shirt").append(""); 7 | }); 8 | shirtSizes = data; 9 | }); 10 | }); 11 | 12 | $("#country").on("change", function () { 13 | if ($(this).val() == "US") { 14 | $("#state").val("VA").removeAttr("disabled").attr("required", "required"); 15 | $("#zip").val("").removeAttr("disabled").attr("required", "required"); 16 | } else { 17 | $("#state").val("").attr("disabled", "disabled").removeAttr("required"); 18 | $("#zip").val("").attr("disabled", "disabled").removeAttr("required"); 19 | } 20 | }); 21 | -------------------------------------------------------------------------------- /registration/templates/registration/dealer/dealer-done.html: -------------------------------------------------------------------------------- 1 | {% extends "registration/master.html" %} 2 | 3 | {% block content %} 4 |
    5 |
    6 |

    Dealer Registration - {{ event }}

    7 |

    Thank you for your Marketplace Payment!

    8 |
    9 |

    Salutations Vendors,

    10 |

    Thank you for participating in {{ event }}'s Dealers Den! We look forward to seeing you. If you have any 11 | questions or concerns, please email {{ event.dealerEmail }}.

    12 |

    Back to Main Page

    13 |

    You should receive email confirmation and receipt shortly.

    14 |
    15 |
    16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /registration/frontend/src/admin/cart/components/CartActionsError.tsx: -------------------------------------------------------------------------------- 1 | import { Component, createEffect, Show } from "solid-js"; 2 | 3 | export const CartActionsError: Component<{ err: any; reset(): void }> = ( 4 | props 5 | ) => { 6 | createEffect(() => { 7 | console.error("Cart had error", props.err); 8 | }); 9 | 10 | return ( 11 |
    12 |
    13 |

    Cart Error

    14 | 15 | 16 |
    17 | 18 | 0} 20 | fallback={
    An unknown error occured.
    } 21 | > 22 |
    {props.err.toString()}
    23 |
    24 |
    25 | ); 26 | }; 27 | -------------------------------------------------------------------------------- /registration/migrations/0024_auto_20161020_1910.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-10-20 23:10 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0023_auto_20161020_1843"), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name="dealer", 17 | name="shareWith", 18 | ), 19 | migrations.AddField( 20 | model_name="dealer", 21 | name="partners", 22 | field=models.TextField(blank=True), 23 | ), 24 | migrations.AddField( 25 | model_name="dealer", 26 | name="tables", 27 | field=models.IntegerField(default=0), 28 | ), 29 | ] 30 | -------------------------------------------------------------------------------- /registration/migrations/0052_auto_20170715_1734.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2017-07-15 21:34 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0051_orderitem_badge"), 12 | ] 13 | 14 | operations = [ 15 | migrations.DeleteModel( 16 | name="AttendeeOnsite", 17 | ), 18 | migrations.AddField( 19 | model_name="pricelevel", 20 | name="emailVIP", 21 | field=models.BooleanField(default=False), 22 | ), 23 | migrations.AddField( 24 | model_name="pricelevel", 25 | name="emailVIPEmails", 26 | field=models.CharField(blank=True, default="", max_length=400), 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /registration/migrations/0055_auto_20171009_1134.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2017-10-09 15:34 3 | 4 | 5 | import django.utils.timezone 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0054_auto_20170920_2254"), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name="event", 18 | name="eventEnd", 19 | field=models.DateField(default=django.utils.timezone.now), 20 | preserve_default=False, 21 | ), 22 | migrations.AddField( 23 | model_name="event", 24 | name="eventStart", 25 | field=models.DateField(default=django.utils.timezone.now), 26 | preserve_default=False, 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | default_language_version: 2 | python: python3 3 | 4 | exclude: venv/|static/ 5 | 6 | repos: 7 | - repo: https://github.com/pycqa/isort 8 | rev: 5.13.2 9 | hooks: 10 | - id: isort 11 | name: isort (python) 12 | 13 | - repo: https://github.com/pre-commit/pre-commit-hooks 14 | rev: v5.0.0 15 | hooks: 16 | - id: check-builtin-literals 17 | - id: trailing-whitespace 18 | - id: end-of-file-fixer 19 | - id: check-ast 20 | - id: mixed-line-ending 21 | args: [--fix=lf] 22 | 23 | - repo: https://github.com/ambv/black 24 | rev: 24.10.0 25 | hooks: 26 | - id: black 27 | 28 | ## Not supported with Django templates right now :( 29 | # - repo: https://github.com/prettier/prettier 30 | # rev: "2.7.1" 31 | # files: \.(js|css)$ 32 | # hooks: 33 | ## - id: prettier 34 | -------------------------------------------------------------------------------- /registration/migrations/0047_auto_20170428_2054.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2017-04-29 00:54 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0046_auto_20170427_1003"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name="order", 17 | name="charityDonation", 18 | field=models.DecimalField( 19 | decimal_places=2, default=0, max_digits=8, null=True 20 | ), 21 | ), 22 | migrations.AlterField( 23 | model_name="order", 24 | name="orgDonation", 25 | field=models.DecimalField( 26 | decimal_places=2, default=0, max_digits=8, null=True 27 | ), 28 | ), 29 | ] 30 | -------------------------------------------------------------------------------- /registration/templates/registration/printing.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Print Dialog 5 | 6 | 7 | 8 | Go Back 9 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /registration/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from django.forms import ModelForm 3 | from django.forms.widgets import TextInput 4 | 5 | from .models import Firebase 6 | 7 | 8 | class FirebaseForm(ModelForm): 9 | class Meta: 10 | model = Firebase 11 | fields = ( 12 | "name", 13 | "token", 14 | "cashdrawer", 15 | "payment_type", 16 | "square_terminal_id", 17 | "print_via_mqtt", 18 | "webview", 19 | "background_color", 20 | ) 21 | widgets = { 22 | "foreground_color": TextInput(attrs={"type": "color"}), 23 | "background_color": TextInput(attrs={"type": "color"}), 24 | } 25 | 26 | 27 | class SignatureUploadForm(forms.Form): 28 | badge_id = forms.IntegerField() 29 | svg_file = forms.FileField() 30 | png_file = forms.FileField() 31 | -------------------------------------------------------------------------------- /registration/migrations/0088_webview_null.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.17 on 2020-02-19 10:08 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0087_firebase_provision"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name="firebase", 17 | name="webview", 18 | field=models.CharField( 19 | blank=True, 20 | default=b"https://www.furthemore.org/code-of-conduct-embed/", 21 | max_length=500, 22 | null=True, 23 | ), 24 | ), 25 | migrations.AlterField( 26 | model_name="tablesize", 27 | name="description", 28 | field=models.TextField(), 29 | ), 30 | ] 31 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/chargeback-notice.txt: -------------------------------------------------------------------------------- 1 | Hello {{ order.billingName }}, 2 | 3 | Our systems have detected a chargeback dispute initated in relation to your registration transaction. 4 | 5 | Consistent with our refund policy as outlined by the attendee code of conduct, your order has been placed on hold, 6 | and you will be unable to retrieve your badge or register for {{ event.name }} again at least until 7 | the dispute is settled. 8 | 9 | Chargeback disputes (denying a charge) made for the sole purpose of avoiding payment, made without sufficient cause, 10 | or that are made without first attempting to resolve the dispute directly may result in permanent revocation of 11 | membership privileges. 12 | 13 | Please contact {{ event.registrationEmail }} for any questions or assistance. 14 | 15 | -- 16 | {{ event.name }} <{{ event.registrationEmail }}> 17 | {{ event.codeOfConduct }} 18 | -------------------------------------------------------------------------------- /registration/frontend/esbuild.mjs: -------------------------------------------------------------------------------- 1 | import { writeFileSync } from "fs"; 2 | 3 | import esbuild from "esbuild"; 4 | import { sassPlugin } from "esbuild-sass-plugin"; 5 | import { solidPlugin } from "esbuild-plugin-solid"; 6 | 7 | const IS_PROD = process.env.NODE_ENVIRONMENT === "production"; 8 | 9 | const result = await esbuild.build({ 10 | bundle: true, 11 | drop: IS_PROD ? ["console"] : [], 12 | entryPoints: ["src/entrypoints/admin.tsx"], 13 | metafile: true, 14 | minify: IS_PROD, 15 | outdir: "../static/", 16 | sourcemap: true, 17 | target: ["es2020"], 18 | loader: { 19 | ".woff": "file", 20 | ".woff2": "file", 21 | ".ttf": "file", 22 | }, 23 | plugins: [ 24 | sassPlugin({ 25 | quietDeps: ["bulma"], 26 | }), 27 | solidPlugin(), 28 | ], 29 | }); 30 | 31 | if (result.metafile) { 32 | writeFileSync("./metafile.json", JSON.stringify(result.metafile)); 33 | } 34 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | beautifulsoup4>=4.12.3 2 | configobj==5.0.9 3 | django>=3.2.24,<4 4 | django-admin-env-notice~=0.4 5 | django-debug-toolbar~=4.3.0 6 | django-extensions~=3.2.3 7 | django-idempotency-key~=1.3.0 8 | django-import-export~=3.3.7 9 | django-maintenance-mode==0.21.1 10 | django-mathfilters~=1.0.0 11 | django-nested-inline~=0.4.6 12 | django-prometheus~=2.3.1 13 | django-redis~=5.4.0 14 | #django-u2f~=1.0.1 15 | git+https://github.com/rechner/django-u2f.git@23022f80ae4af831e3533464a0b54e6ec46b2ca1 16 | django-widget-tweaks==1.5.0 17 | freezegun>=1.4.0 18 | gotenberg-client~=0.7.0 19 | influxdb~=5.3.1 # Influx < v1.7 20 | influxdb-client~=1.40.0 # Influxdb 1.8, 2.x 21 | markuppy 22 | paho-mqtt==1.6.1 23 | Pillow>=5.3 24 | psycopg2-binary>=2.9.9 25 | PyJWT~=2.8.0 26 | respx==0.22.0 27 | sentry-sdk 28 | squareup==22.0.0.20220921 29 | qrcode~=7.4.2 30 | pytz~=2024.1 31 | Pygments~=2.18.0 32 | soupsieve==2.6 33 | -------------------------------------------------------------------------------- /fm_eventmanager/urls.py: -------------------------------------------------------------------------------- 1 | import django_u2f.urls 2 | from django.conf import settings 3 | from django.conf.urls import include, url 4 | from django.contrib import admin 5 | from django.views.generic import RedirectView 6 | from django.http import HttpResponse 7 | 8 | admin.autodiscover() 9 | 10 | urlpatterns = [ 11 | url( 12 | r"robots.txt", 13 | lambda x: HttpResponse("User-Agent: *\n\nDisallow: /", content_type="text/plain"), 14 | name="robots_file" 15 | ), 16 | url(r"^registration/", include("registration.urls", namespace="registration")), 17 | url(r"^admin/", admin.site.urls), 18 | url(r"^u2f/", include(django_u2f.urls, namespace="u2f")), 19 | url(r"^$", RedirectView.as_view(url="registration"), name="root"), 20 | ] 21 | 22 | if settings.DEBUG: 23 | import debug_toolbar 24 | 25 | urlpatterns = [ 26 | url(r"^__debug__/", include(debug_toolbar.urls)), 27 | ] + urlpatterns 28 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts AS assets 2 | 3 | ENV NODE_ENVIRONMENT=production 4 | 5 | WORKDIR /app/registration/frontend 6 | 7 | COPY ./registration/frontend/package.json ./registration/frontend/package-lock.json /app/registration/frontend/ 8 | RUN npm install 9 | COPY ./registration/frontend/ /app/registration/frontend/ 10 | RUN node esbuild.mjs 11 | 12 | FROM ghcr.io/furthemore/apis:apis-base-924ec88 13 | 14 | LABEL org.opencontainers.image.source="https://github.com/furthemore/APIS" 15 | 16 | ARG SENTRY_RELEASE=local 17 | ENV SENTRY_RELEASE=${SENTRY_RELEASE} 18 | 19 | EXPOSE 80 20 | EXPOSE 443 21 | 22 | WORKDIR /app 23 | 24 | COPY . /app/ 25 | COPY ./fm_eventmanager/settings.py.docker /app/fm_eventmanager/settings.py 26 | COPY --from=assets /app/registration/static/ /app/registration/static/ 27 | 28 | RUN DJANGO_SECRET_KEY=collectstatic ./manage.py collectstatic --noinput 29 | 30 | ENTRYPOINT ["/entrypoint.sh"] 31 | 32 | CMD ["/start.sh"] 33 | -------------------------------------------------------------------------------- /registration/migrations/0017_auto_20161009_1154.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-10-09 15:54 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0016_priceleveloption_required"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="attendeeoptions", 17 | name="optionValue2", 18 | field=models.CharField(blank=True, max_length=200), 19 | ), 20 | migrations.AddField( 21 | model_name="priceleveloption", 22 | name="unique", 23 | field=models.BooleanField(default=False), 24 | ), 25 | migrations.AddField( 26 | model_name="priceleveloption", 27 | name="valueCount", 28 | field=models.IntegerField(default=1), 29 | ), 30 | ] 31 | -------------------------------------------------------------------------------- /registration/migrations/0071_auto_20180721_2029.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-07-22 00:29 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0070_auto_20180719_1728"), 13 | ] 14 | 15 | operations = [ 16 | migrations.RemoveField( 17 | model_name="event", 18 | name="dealerBasePriceLevel", 19 | ), 20 | migrations.AddField( 21 | model_name="event", 22 | name="dealerDiscount", 23 | field=models.ForeignKey( 24 | blank=True, 25 | null=True, 26 | on_delete=django.db.models.deletion.SET_NULL, 27 | related_name="dealerEvent", 28 | to="registration.Discount", 29 | ), 30 | ), 31 | ] 32 | -------------------------------------------------------------------------------- /registration/migrations/0102_event_dealer_wifi_partner_price.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.25 on 2024-10-17 07:20 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ("registration", "0101_auto_20240630_0045"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name="event", 15 | name="dealerPartnerPrice", 16 | field=models.DecimalField(decimal_places=2, default=55, max_digits=6), 17 | ), 18 | migrations.AddField( 19 | model_name="event", 20 | name="dealerWifi", 21 | field=models.BooleanField(default=True), 22 | ), 23 | migrations.AddField( 24 | model_name="event", 25 | name="dealerWifiPrice", 26 | field=models.DecimalField(decimal_places=2, default=50, max_digits=6), 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /registration/migrations/0031_auto_20161223_1717.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-12-23 22:17 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0030_auto_20161221_1121"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="attendee", 17 | name="registrationToken", 18 | field=models.CharField(default=12345, max_length=200), 19 | preserve_default=False, 20 | ), 21 | migrations.AddField( 22 | model_name="discount", 23 | name="oneTime", 24 | field=models.BooleanField(default=False), 25 | ), 26 | migrations.AddField( 27 | model_name="discount", 28 | name="reason", 29 | field=models.CharField(blank=True, max_length=100), 30 | ), 31 | ] 32 | -------------------------------------------------------------------------------- /registration/migrations/0037_auto_20161230_1154.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-12-30 16:54 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0036_staffjersey"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name="order", 17 | name="charityDonation", 18 | field=models.DecimalField(decimal_places=2, max_digits=8, null=True), 19 | ), 20 | migrations.AlterField( 21 | model_name="order", 22 | name="orgDonation", 23 | field=models.DecimalField(decimal_places=2, max_digits=8, null=True), 24 | ), 25 | migrations.AlterField( 26 | model_name="order", 27 | name="total", 28 | field=models.DecimalField(decimal_places=2, max_digits=8), 29 | ), 30 | ] 31 | -------------------------------------------------------------------------------- /registration/migrations/0092_dealer_asst_discount.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.25 on 2021-12-17 05:59 2 | 3 | import django.db.models.deletion 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ("registration", "0092_auto_20211219_0409_squashed_0093_auto_20211219_0436"), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name="event", 16 | name="assistantDiscount", 17 | field=models.ForeignKey( 18 | blank=True, 19 | help_text="Apply a discount for any dealer assistant registrations", 20 | null=True, 21 | on_delete=django.db.models.deletion.SET_NULL, 22 | related_name="assistantEvent", 23 | to="registration.Discount", 24 | verbose_name="Dealer Assistant Discount", 25 | ), 26 | ), 27 | ] 28 | -------------------------------------------------------------------------------- /registration/templates/admin/firebase_qr.html: -------------------------------------------------------------------------------- 1 | {% extends "admin/base_site.html" %} 2 | {% load static %} 3 | 4 | {% block content %} 5 | {% if request.user.is_superuser %} 6 |
    7 | {{ qr_svg | safe }}

    8 | 9 |

    Setup payment terminal

    10 |

    Press the clock on the payment terminal you wish to provision, and press "Provision Settings".

    11 | 12 |

    Client worker (APIS-Receipts)

    13 |

    Use this credential in the settings.py file to configure access to receipt printers and barcode scanners:

    14 |
    15 | MQTT_LOGIN = {
    16 |     "username": "{{token.user}}",
    17 |     "password": "{{token.token}}",
    18 | }
    19 |   
    20 | 21 | 22 | 25 | 26 | {% else %} 27 |

    Sorry

    28 |

    You must be a superuser to access this URL.

    29 | {% endif %} 30 | 31 | {% endblock %} 32 | -------------------------------------------------------------------------------- /nginx.conf: -------------------------------------------------------------------------------- 1 | daemon off; 2 | error_log /var/log/nginx/error.log warn; 3 | pid /var/run/nginx.pid; 4 | user nginx; 5 | worker_processes 1; 6 | 7 | events { 8 | worker_connections 1024; 9 | } 10 | 11 | http { 12 | include /etc/nginx/mime.types; 13 | default_type application/octet-stream; 14 | log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 15 | '$status $body_bytes_sent "$http_referer" ' 16 | '"$http_user_agent" "$http_x_forwarded_for"'; 17 | access_log /var/log/nginx/access.log main; 18 | sendfile on; 19 | keepalive_timeout 65; 20 | 21 | server { 22 | listen 80 default_server; 23 | 24 | location / { 25 | include uwsgi_params; 26 | uwsgi_pass unix:///tmp/uwsgi.sock; 27 | } 28 | 29 | location /static/ { 30 | alias /app/apis/static/; 31 | add_header "Cache-Control" "max-age=31536000, immutable"; 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /registration/frontend/src/admin/scan/index.ts: -------------------------------------------------------------------------------- 1 | import { ScanPanel } from "./components/ScanPanel"; 2 | 3 | export { ScanPanel }; 4 | 5 | export interface IdData { 6 | documentType: string; 7 | first: string; 8 | last: string; 9 | dob: string; 10 | expiry: string; 11 | address?: AddressData; 12 | } 13 | 14 | export interface AddressData { 15 | address: string; 16 | address2: string; 17 | city: string; 18 | state: string; 19 | ZIP: string; 20 | country: string; 21 | } 22 | 23 | export interface ShcData { 24 | name: string; 25 | birthday: string; 26 | verification: ShcIssuer; 27 | vaccines: ShcVaccine[]; 28 | } 29 | 30 | export interface ShcIssuer { 31 | issuer: string; 32 | verified: boolean; 33 | trusted: boolean; 34 | } 35 | 36 | export interface ShcVaccine { 37 | name: string; 38 | lotNumber: string; 39 | status: string; 40 | date: string; 41 | performer: string; 42 | } 43 | 44 | export interface ShcMatch { 45 | name: boolean; 46 | dob: boolean; 47 | } 48 | -------------------------------------------------------------------------------- /registration/migrations/0044_auto_20170316_2219.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2017-03-17 02:19 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0043_auto_20170310_2243"), 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name="AttendeeOnsite", 17 | fields=[], 18 | options={ 19 | "proxy": True, 20 | }, 21 | bases=("registration.attendee",), 22 | ), 23 | migrations.AddField( 24 | model_name="attendeeoptions", 25 | name="optionValue2", 26 | field=models.CharField(blank=True, max_length=200), 27 | ), 28 | migrations.AddField( 29 | model_name="attendeeoptions", 30 | name="optionValue3", 31 | field=models.CharField(blank=True, max_length=200), 32 | ), 33 | ] 34 | -------------------------------------------------------------------------------- /registration/migrations/0094_add_preferred_name.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.25 on 2022-01-17 01:46 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ("registration", "0093_add_dealerasst_paid"), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name="attendee", 15 | name="preferredName", 16 | field=models.CharField( 17 | blank=True, max_length=200, verbose_name="Preferred First Name" 18 | ), 19 | ), 20 | migrations.AlterField( 21 | model_name="attendee", 22 | name="firstName", 23 | field=models.CharField(max_length=200, verbose_name="Legal First Name"), 24 | ), 25 | migrations.AlterField( 26 | model_name="attendee", 27 | name="lastName", 28 | field=models.CharField(max_length=200, verbose_name="Legal Last Name"), 29 | ), 30 | ] 31 | -------------------------------------------------------------------------------- /registration/tests/test_registration_tags.py: -------------------------------------------------------------------------------- 1 | from unittest import TestCase 2 | 3 | from registration.models import Event, Venue 4 | from registration.templatetags import registration_tags 5 | from registration.tests.common import DEFAULT_EVENT_ARGS 6 | 7 | 8 | class TestTags(TestCase): 9 | def setUp(self): 10 | self.venue = Venue.objects.create(country="Pastafaria") 11 | self.venue.save() 12 | self.event = Event(**DEFAULT_EVENT_ARGS) 13 | self.event.save() 14 | 15 | def test_venue_country_empty(self): 16 | result = registration_tags.venue_country(self.event) 17 | self.assertEqual(result, "") 18 | 19 | def test_venue_country_value(self): 20 | self.event.venue = self.venue 21 | result = registration_tags.venue_country(self.event) 22 | self.assertEqual(result, self.venue.country) 23 | 24 | def test_get_value(self): 25 | d = {"foo": "bar"} 26 | result = registration_tags.get_value(d, "foo") 27 | self.assertEqual(result, "bar") 28 | -------------------------------------------------------------------------------- /templates/u2f/backup_codes.html: -------------------------------------------------------------------------------- 1 | {% extends "u2f/base.html" %} 2 | {% load i18n %} 3 | {% block title %}{% trans 'U2F Keys' %}{% endblock %} 4 | {% block content %} 5 | {{ block.super }} 6 | 7 |
    8 |
    9 | 10 |

    Two Factor Settings

    11 | {% trans '← Back to settings' %} 12 | 13 |

    Backup Codes

    14 | {% if object_list %} 15 |
    16 | {% for code in object_list %} 17 | {{ code.code }}
    18 | {% endfor %} 19 |
    20 | {% else %} 21 |
    {% trans 'You do not have any backup codes! Please create some!' %}
    22 | {% endif %} 23 | 24 |
    25 | {% csrf_token %} 26 | 27 |
    28 |
    29 |
    30 | 31 | {% endblock %} 32 | -------------------------------------------------------------------------------- /registration/migrations/0036_staffjersey.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-12-30 14:09 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0035_auto_20161228_1940"), 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name="StaffJersey", 18 | fields=[ 19 | ( 20 | "jersey_ptr", 21 | models.OneToOneField( 22 | auto_created=True, 23 | on_delete=django.db.models.deletion.CASCADE, 24 | parent_link=True, 25 | primary_key=True, 26 | serialize=False, 27 | to="registration.Jersey", 28 | ), 29 | ), 30 | ], 31 | bases=("registration.jersey",), 32 | ), 33 | ] 34 | -------------------------------------------------------------------------------- /registration/migrations/0058_banlist.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2017-10-22 14:44 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0057_tablesize_event"), 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name="BanList", 17 | fields=[ 18 | ( 19 | "id", 20 | models.AutoField( 21 | auto_created=True, 22 | primary_key=True, 23 | serialize=False, 24 | verbose_name="ID", 25 | ), 26 | ), 27 | ("firstName", models.CharField(blank=True, max_length=200)), 28 | ("lastName", models.CharField(blank=True, max_length=200)), 29 | ("email", models.CharField(blank=True, max_length=400)), 30 | ], 31 | ), 32 | ] 33 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/chargeback-notice.html: -------------------------------------------------------------------------------- 1 |

    Hello {{ order.billingName }},

    2 | 3 |

    Our systems have detected a chargeback dispute initated in relation to your registration transaction.

    4 | 5 |

    6 | Consistent with our refund policy as outlined by the attendee code of conduct, 7 | your order has been placed on hold, and you will be unable to retrieve your badge or register for {{ event.name }} 8 | again at least until the dispute is settled. 9 |

    10 | 11 |

    12 | Chargeback disputes (denying a charge) made for the sole purpose of avoiding payment, made without sufficient cause, 13 | or that are made without first attempting to resolve the dispute directly may result in permanent revocation of 14 | membership privileges. 15 |

    16 |

    17 | Please contact {{ event.registrationEmail }} for any questions or assistance. 18 |

    19 | 20 |

    21 | --
    22 | {{ event.name }} {{ event.registrationEmail }} 23 |

    24 | -------------------------------------------------------------------------------- /registration/migrations/0022_auto_20161020_1832.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-10-20 22:32 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0021_auto_20161013_1941"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="dealer", 17 | name="breakfast", 18 | field=models.BooleanField(default=False), 19 | ), 20 | migrations.AddField( 21 | model_name="dealer", 22 | name="willSwitch", 23 | field=models.BooleanField(default=False), 24 | ), 25 | migrations.AddField( 26 | model_name="tablesize", 27 | name="tableMax", 28 | field=models.IntegerField(default=0), 29 | ), 30 | migrations.AddField( 31 | model_name="tablesize", 32 | name="tableMin", 33 | field=models.IntegerField(default=0), 34 | ), 35 | ] 36 | -------------------------------------------------------------------------------- /templates/u2f/add_key.html: -------------------------------------------------------------------------------- 1 | {% extends "u2f/base.html" %} 2 | {% load widget_tweaks %} 3 | {% load i18n %} 4 | {% load static %} 5 | {% block title %}{% trans 'Add U2F Key' %}{% endblock %} 6 | 7 | {% block content %} 8 | {{ block.super }} 9 | 10 |
    11 |
    12 | 13 |

    Two Factor Settings

    14 | {% trans '← Back to settings' %} 15 |

    {% trans 'To add a security key to your account, insert (and tap) it.' %}

    16 | 17 |

    18 |
    19 | {% csrf_token %} 20 | {% for field in form.visible_fields %} 21 | {% render_field field readonly="readonly" class="form-control" placeholder="Waiting for token..." %} 22 | {% endfor %} 23 |
    24 | 25 |
    26 |
    27 | 28 | {{ registration_request|json_script:"django_u2f_registration" }} 29 | 30 | {% endblock %} 31 | -------------------------------------------------------------------------------- /registration/migrations/0087_firebase_provision.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.17 on 2020-02-19 08:22 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0086_rename_tables_squashed_0087_onsite_reg_start"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name="firebase", 17 | name="background_color", 18 | field=models.CharField(default="#0099cc", max_length=10), 19 | ), 20 | migrations.AddField( 21 | model_name="firebase", 22 | name="foreground_color", 23 | field=models.CharField(default="#ffffff", max_length=10), 24 | ), 25 | migrations.AddField( 26 | model_name="firebase", 27 | name="webview", 28 | field=models.CharField( 29 | default=b"https://www.furthemore.org/code-of-conduct-embed/", 30 | max_length=500, 31 | ), 32 | ), 33 | ] 34 | -------------------------------------------------------------------------------- /registration/migrations/0054_auto_20170920_2254.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2017-09-21 02:54 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0053_auto_20170916_1047"), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name="dealer", 18 | name="event", 19 | field=models.ForeignKey( 20 | blank=True, 21 | null=True, 22 | on_delete=django.db.models.deletion.SET_NULL, 23 | to="registration.Event", 24 | ), 25 | ), 26 | migrations.AddField( 27 | model_name="staff", 28 | name="event", 29 | field=models.ForeignKey( 30 | blank=True, 31 | null=True, 32 | on_delete=django.db.models.deletion.SET_NULL, 33 | to="registration.Event", 34 | ), 35 | ), 36 | ] 37 | -------------------------------------------------------------------------------- /registration/frontend/src/admin/attendee-search/index.ts: -------------------------------------------------------------------------------- 1 | import { ApisUrls, CSRF_TOKEN } from "../../entrypoints/admin"; 2 | import { AttendeeSearch } from "./components/AttendeeSearch"; 3 | 4 | export { AttendeeSearch }; 5 | 6 | export interface BadgeResult { 7 | id: number; 8 | editUrl: string; 9 | attendee: Attendee; 10 | badgeName: string; 11 | badgeNumber?: number; 12 | abandoned: string; 13 | } 14 | 15 | export interface Attendee { 16 | firstName: string; 17 | lastName: string; 18 | preferredName?: string; 19 | } 20 | 21 | export async function getSearchResults( 22 | urls: ApisUrls, 23 | query: string 24 | ): Promise { 25 | // Clear results if we search for an empty string. 26 | if (query.trim().length === 0) { 27 | return []; 28 | } 29 | 30 | let url = new URL(urls.onsite_admin_search, window.location.href); 31 | url.searchParams.set("search", query); 32 | 33 | const resp = await fetch(url, { 34 | headers: { 35 | "x-csrftoken": CSRF_TOKEN, 36 | }, 37 | }); 38 | const data = await resp.json(); 39 | 40 | return data["results"]; 41 | } 42 | -------------------------------------------------------------------------------- /registration/static/img/bootstrap-formhelpers-countries.flags-LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright (c) 2012 Go Squared Ltd. http://www.gosquared.com/ 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 4 | 5 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 6 | 7 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 8 | -------------------------------------------------------------------------------- /registration/static/js/dealers/dealerasst-add.js: -------------------------------------------------------------------------------- 1 | function getAssistants() { 2 | let partners = []; 3 | const partnerList = $(".partnerGroup"); 4 | $.each(partnerList, function (key, item) { 5 | let partner = {}; 6 | const itemList = $(item).find("input") 7 | let hasValues = false; 8 | $.each(itemList, function (key2, item2) { 9 | const id = item2.id.split('_')[0]; 10 | if (($(item2).val() != "") && ($(item2).is(":enabled"))) { 11 | hasValues = true; 12 | } 13 | // partner['existing'] = item2.id.split('_')[1]; 14 | partner[id] = $(item2).val(); 15 | }); 16 | if (hasValues) { 17 | partner['license'] = 'NA'; 18 | partners.push(partner); 19 | } 20 | }); 21 | return partners; 22 | } 23 | 24 | $(document).ready(function () { 25 | let on_partner_keyup = function (e) { 26 | let partners = getAssistants(); 27 | $("#total").text("$" + 55 * partners.length + ".00"); 28 | }; 29 | 30 | $(".partnerGroup input").keyup(on_partner_keyup); 31 | on_partner_keyup(); 32 | }); -------------------------------------------------------------------------------- /registration/templates/registration/dealer/dealer-thanks.html: -------------------------------------------------------------------------------- 1 | {% extends "registration/master.html" %} 2 | 3 | {% block content %} 4 |
    5 |
    6 |

    Dealer Registration - {{ event }}

    7 |

    Thank you for your Marketplace Application!

    8 |
    9 |

    The cut off date for primary applicants will be {{ event.dealerRegEnd|date:'F jS, Y' }}, and selections will be 10 | made/notifications sent shortly after.

    11 |

    If you have not received an acceptance notification by that date, you will be placed on the waitlist for the 12 | next available spot. If you have any questions, please feel free to contact us: {{ event.dealerEmail }}

    14 |

    If you have listed any partners, they will receive an email with instructions about how to register after your 15 | payment has been received.

    16 |

    Thank you!

    17 |

    Back to Main Page

    18 |
    19 |
    20 | {% endblock %} 21 | -------------------------------------------------------------------------------- /registration/migrations/0065_auto_20180425_2022.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-04-26 00:22 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0064_event_default"), 13 | ] 14 | 15 | operations = [ 16 | migrations.RemoveField( 17 | model_name="event", 18 | name="dealerAsstDiscount", 19 | ), 20 | migrations.RemoveField( 21 | model_name="event", 22 | name="dealerDiscount", 23 | ), 24 | migrations.RemoveField( 25 | model_name="event", 26 | name="staffDiscount", 27 | ), 28 | migrations.AddField( 29 | model_name="event", 30 | name="dealerBasePriceLevel", 31 | field=models.ForeignKey( 32 | blank=True, 33 | null=True, 34 | on_delete=django.db.models.deletion.SET_NULL, 35 | to="registration.PriceLevel", 36 | ), 37 | ), 38 | ] 39 | -------------------------------------------------------------------------------- /registration/templates/registration/customer-display.html: -------------------------------------------------------------------------------- 1 | 2 | {% for badge in result %} 3 | 4 | 9 | 10 | {% endfor %} 11 |
    5 | {{ badge.firstName }} {{ badge.lastName }}
    6 | "{{ badge.badgeName }}"
    7 | {{ badge.effectiveLevel.name }} Registration 8 |
    ${{ badge.effectiveLevel.price }}
    12 | 13 |
    14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
    Charity Donation${{ charityDonation }}
    Organisation Donation${{ orgDonation }}
    23 |
    24 |
    Total: ${{ total }}
    25 | 49 | -------------------------------------------------------------------------------- /uwsgi.ini: -------------------------------------------------------------------------------- 1 | [uwsgi] 2 | chdir = /app 3 | module = fm_eventmanager.wsgi_docker:application 4 | master = true 5 | pidfile = /tmp/project-master.pid 6 | vacuum = true ; Delete sockets during shutdown 7 | die-on-term = true ; Shutdown on SIGTERM 8 | need-app = true 9 | 10 | harakiri = 120 ; forcefully kill workers after 120 seconds 11 | py-callos-afterfork = true ; allow workers to trap signals 12 | 13 | log-x-forwarded-for = true 14 | disable-logging = true ; Disable built-in logging 15 | log-4xx = true ; but log 4xx's anyway 16 | log-5xx = true ; and 5xx's 17 | 18 | close-on-exec = True 19 | lazy-apps = true 20 | enable-threads = true 21 | single-interpreter = true 22 | 23 | max-requests = 2000 ; Restart workers after this many requests 24 | max-worker-lifetime = 3600 ; Restart workers after this many seconds 25 | reload-on-rss = 2048 ; Restart workers after this much resident memory 26 | worker-reload-mercy = 60 ; How long to wait before forcefully killing workers 27 | 28 | auto-procname = true 29 | procname-prefix = "apis " 30 | -------------------------------------------------------------------------------- /registration/migrations/0032_auto_20161223_1732.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-12-23 22:32 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | import registration.models 8 | 9 | 10 | class Migration(migrations.Migration): 11 | 12 | dependencies = [ 13 | ("registration", "0031_auto_20161223_1717"), 14 | ] 15 | 16 | operations = [ 17 | migrations.AlterField( 18 | model_name="attendee", 19 | name="registrationToken", 20 | field=models.CharField( 21 | default=registration.models.getRegistrationToken, max_length=200 22 | ), 23 | ), 24 | migrations.AlterField( 25 | model_name="dealer", 26 | name="registrationToken", 27 | field=models.CharField( 28 | default=registration.models.getRegistrationToken, max_length=200 29 | ), 30 | ), 31 | migrations.AlterField( 32 | model_name="staff", 33 | name="registrationToken", 34 | field=models.CharField( 35 | default=registration.models.getRegistrationToken, max_length=200 36 | ), 37 | ), 38 | ] 39 | -------------------------------------------------------------------------------- /registration/migrations/0070_auto_20180719_1728.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-07-19 21:28 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0069_temptoken_sent"), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name="event", 18 | name="newStaffDiscount", 19 | field=models.ForeignKey( 20 | blank=True, 21 | null=True, 22 | on_delete=django.db.models.deletion.SET_NULL, 23 | related_name="newStaffEvent", 24 | to="registration.Discount", 25 | ), 26 | ), 27 | migrations.AddField( 28 | model_name="event", 29 | name="staffDiscount", 30 | field=models.ForeignKey( 31 | blank=True, 32 | null=True, 33 | on_delete=django.db.models.deletion.SET_NULL, 34 | related_name="staffEvent", 35 | to="registration.Discount", 36 | ), 37 | ), 38 | ] 39 | -------------------------------------------------------------------------------- /registration/migrations/0089_badge_signature.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.17 on 2020-02-26 22:36 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | import registration.models 8 | 9 | 10 | class Migration(migrations.Migration): 11 | 12 | dependencies = [ 13 | ("registration", "0088_webview_null"), 14 | ] 15 | 16 | operations = [ 17 | migrations.AddField( 18 | model_name="badge", 19 | name="signature_bitmap", 20 | field=models.ImageField( 21 | blank=True, 22 | null=True, 23 | upload_to=registration.models.badge_signature_bitmap_path, 24 | ), 25 | ), 26 | migrations.AddField( 27 | model_name="badge", 28 | name="signature_svg", 29 | field=models.FileField( 30 | blank=True, 31 | null=True, 32 | upload_to=registration.models.badge_signature_svg_path, 33 | ), 34 | ), 35 | migrations.AddField( 36 | model_name="order", 37 | name="onsite_reference", 38 | field=models.UUIDField(blank=True, null=True), 39 | ), 40 | ] 41 | -------------------------------------------------------------------------------- /registration/management/commands/start_db.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | import sys 3 | 4 | from django.conf import settings 5 | from django.core.management.base import BaseCommand 6 | 7 | from registration.utils.database import DatabaseStatus, Postgres 8 | 9 | 10 | class Command(BaseCommand): 11 | help = "Starts the development postgresql database." 12 | 13 | def add_arguments(self, parser): 14 | base_dir = Path(settings.BASE_DIR) 15 | db_dir = (base_dir / "pgdb").absolute() 16 | 17 | parser.add_argument( 18 | "--db-path", 19 | type=str, 20 | default=str(db_dir), 21 | help=f"Path where the postgresql database will be stopped, default {db_dir}.", 22 | ) 23 | 24 | def handle(self, *args, **options): 25 | postgres = Postgres(options["db_path"]) 26 | 27 | status = postgres.get_status() 28 | if status == DatabaseStatus.STOPPED: 29 | postgres.start() 30 | 31 | print("Postgres server started") 32 | elif status == DatabaseStatus.RUNNING: 33 | print("Postgres server is already running") 34 | else: 35 | print(f"Cannot start Postgres server, invalid status: {status}", file=sys.stderr) 36 | -------------------------------------------------------------------------------- /registration/migrations/0069_auto_20180802_2118.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-08-03 01:18 3 | 4 | 5 | import django.db.models.deletion 6 | from django.conf import settings 7 | from django.db import migrations, models 8 | 9 | 10 | class Migration(migrations.Migration): 11 | 12 | dependencies = [ 13 | ("registration", "0068_auto_20180802_2110"), 14 | ] 15 | 16 | operations = [ 17 | migrations.AlterField( 18 | model_name="cashdrawer", 19 | name="tendered", 20 | field=models.DecimalField( 21 | blank=True, decimal_places=2, default=0, max_digits=8 22 | ), 23 | ), 24 | migrations.AlterField( 25 | model_name="cashdrawer", 26 | name="timestamp", 27 | field=models.DateTimeField(auto_now_add=True), 28 | ), 29 | migrations.AlterField( 30 | model_name="cashdrawer", 31 | name="user", 32 | field=models.ForeignKey( 33 | blank=True, 34 | null=True, 35 | on_delete=django.db.models.deletion.SET_NULL, 36 | to=settings.AUTH_USER_MODEL, 37 | ), 38 | ), 39 | ] 40 | -------------------------------------------------------------------------------- /registration/management/commands/stop_db.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | from django.conf import settings 4 | from django.core.management.base import BaseCommand 5 | 6 | from registration.utils.database import DatabaseStatus, Postgres 7 | 8 | 9 | class Command(BaseCommand): 10 | help = "Stops the development postgresql database." 11 | 12 | def add_arguments(self, parser): 13 | base_dir = Path(settings.BASE_DIR) 14 | db_dir = (base_dir / "pgdb").absolute() 15 | 16 | parser.add_argument( 17 | "--db-path", 18 | type=str, 19 | default=str(db_dir), 20 | help=f"Path where the postgresql database will be stopped, default {db_dir}.", 21 | ) 22 | parser.add_argument( 23 | "--delete", 24 | type=bool, 25 | default=False, 26 | help="Whether or not to delete the database after it has been stopped, default False." 27 | ) 28 | 29 | def handle(self, *args, **options): 30 | postgres = Postgres(options["db_path"]) 31 | 32 | status = postgres.get_status() 33 | if status == DatabaseStatus.RUNNING: 34 | postgres.stop() 35 | 36 | if options["delete"]: 37 | postgres.delete() 38 | -------------------------------------------------------------------------------- /registration/migrations/0010_auto_20160828_1010.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-08-28 14:10 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0009_auto_20160821_1340"), 13 | ] 14 | 15 | operations = [ 16 | migrations.RemoveField( 17 | model_name="orderitem", 18 | name="discount", 19 | ), 20 | migrations.AddField( 21 | model_name="order", 22 | name="charityDonation", 23 | field=models.DecimalField(decimal_places=2, max_digits=6, null=True), 24 | ), 25 | migrations.AddField( 26 | model_name="order", 27 | name="discount", 28 | field=models.ForeignKey( 29 | null=True, 30 | on_delete=django.db.models.deletion.SET_NULL, 31 | to="registration.Discount", 32 | ), 33 | ), 34 | migrations.AddField( 35 | model_name="order", 36 | name="orgDonation", 37 | field=models.DecimalField(decimal_places=2, max_digits=6, null=True), 38 | ), 39 | ] 40 | -------------------------------------------------------------------------------- /registration/migrations/0040_staffjersey.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2017-01-29 19:12 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0039_auto_20170129_1410"), 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name="StaffJersey", 18 | fields=[ 19 | ( 20 | "id", 21 | models.AutoField( 22 | auto_created=True, 23 | primary_key=True, 24 | serialize=False, 25 | verbose_name="ID", 26 | ), 27 | ), 28 | ("name", models.CharField(max_length=50)), 29 | ("number", models.CharField(max_length=3)), 30 | ( 31 | "shirtSize", 32 | models.ForeignKey( 33 | on_delete=django.db.models.deletion.CASCADE, 34 | to="registration.ShirtSizes", 35 | ), 36 | ), 37 | ], 38 | ), 39 | ] 40 | -------------------------------------------------------------------------------- /registration/migrations/0067_auto_20180802_2106.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-08-03 01:06 3 | 4 | 5 | import django.db.models.deletion 6 | from django.conf import settings 7 | from django.db import migrations, models 8 | 9 | 10 | class Migration(migrations.Migration): 11 | 12 | dependencies = [ 13 | ("registration", "0066_merge_20180726_1722"), 14 | ] 15 | 16 | operations = [ 17 | migrations.AlterField( 18 | model_name="cashdrawer", 19 | name="action", 20 | field=models.CharField( 21 | choices=[ 22 | ("Open", "Open"), 23 | ("Close", "Close"), 24 | (("Transaction",), "Transaction"), 25 | ("Deposit", "Deposit"), 26 | ], 27 | default="Open", 28 | max_length=20, 29 | ), 30 | ), 31 | migrations.AlterField( 32 | model_name="cashdrawer", 33 | name="user", 34 | field=models.ForeignKey( 35 | null=True, 36 | on_delete=django.db.models.deletion.SET_NULL, 37 | to=settings.AUTH_USER_MODEL, 38 | ), 39 | ), 40 | ] 41 | -------------------------------------------------------------------------------- /registration/migrations/0101_auto_20240630_0045.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.25 on 2024-06-30 04:45 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('registration', '0100_webhook_type'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='badge', 15 | name='signature_bitmap', 16 | field=models.TextField(blank=True, null=True), 17 | ), 18 | migrations.AlterField( 19 | model_name='badge', 20 | name='signature_svg', 21 | field=models.TextField(blank=True, null=True), 22 | ), 23 | migrations.AlterField( 24 | model_name='order', 25 | name='status', 26 | field=models.CharField(choices=[('Pending', 'Pending'), ('Captured', 'Captured'), ('Completed', 'Completed'), ('Refunded', 'Refunded'), ('Refund Pending', 'Refund Pending'), ('Failed', 'Failed'), ('Dispute Evidence Required', 'Dispute Evidence Required'), ('Dispute Processing', 'Dispute Processing'), ('Dispute Won', 'Dispute Won'), ('Dispute Lost', 'Dispute Lost'), ('Dispute Accepted', 'Dispute Accepted')], default='Pending', max_length=50), 27 | ), 28 | ] 29 | -------------------------------------------------------------------------------- /registration/resources/nametag/apis/jquery.fittext.js: -------------------------------------------------------------------------------- 1 | /*global jQuery */ 2 | /*! 3 | * FitText.js 1.2 4 | * 5 | * Copyright 2011, Dave Rupert http://daverupert.com 6 | * Released under the WTFPL license 7 | * http://sam.zoy.org/wtfpl/ 8 | * 9 | * Date: Thu May 05 14:23:00 2011 -0600 10 | */ 11 | 12 | (function( $ ){ 13 | 14 | $.fn.fitText = function( kompressor, options ) { 15 | 16 | // Setup options 17 | var compressor = kompressor || 1, 18 | settings = $.extend({ 19 | 'minFontSize' : Number.NEGATIVE_INFINITY, 20 | 'maxFontSize' : Number.POSITIVE_INFINITY 21 | }, options); 22 | 23 | return this.each(function(){ 24 | 25 | // Store the object 26 | var $this = $(this); 27 | 28 | // Resizer() resizes items based on the object width divided by the compressor * 10 29 | var resizer = function () { 30 | $this.css('font-size', Math.max(Math.min($this.width() / (compressor*10), parseFloat(settings.maxFontSize)), parseFloat(settings.minFontSize))); 31 | }; 32 | 33 | // Call once to set. 34 | resizer(); 35 | 36 | // Call on resize. Opera debounces their resize by default. 37 | $(window).on('resize.fittext orientationchange.fittext', resizer); 38 | 39 | }); 40 | 41 | }; 42 | 43 | })( jQuery ); 44 | -------------------------------------------------------------------------------- /registration/resources/nametag/fd_labels/jquery.fittext.js: -------------------------------------------------------------------------------- 1 | /*global jQuery */ 2 | /*! 3 | * FitText.js 1.2 4 | * 5 | * Copyright 2011, Dave Rupert http://daverupert.com 6 | * Released under the WTFPL license 7 | * http://sam.zoy.org/wtfpl/ 8 | * 9 | * Date: Thu May 05 14:23:00 2011 -0600 10 | */ 11 | 12 | (function( $ ){ 13 | 14 | $.fn.fitText = function( kompressor, options ) { 15 | 16 | // Setup options 17 | var compressor = kompressor || 1, 18 | settings = $.extend({ 19 | 'minFontSize' : Number.NEGATIVE_INFINITY, 20 | 'maxFontSize' : Number.POSITIVE_INFINITY 21 | }, options); 22 | 23 | return this.each(function(){ 24 | 25 | // Store the object 26 | var $this = $(this); 27 | 28 | // Resizer() resizes items based on the object width divided by the compressor * 10 29 | var resizer = function () { 30 | $this.css('font-size', Math.max(Math.min($this.width() / (compressor*10), parseFloat(settings.maxFontSize)), parseFloat(settings.minFontSize))); 31 | }; 32 | 33 | // Call once to set. 34 | resizer(); 35 | 36 | // Call on resize. Opera debounces their resize by default. 37 | $(window).on('resize.fittext orientationchange.fittext', resizer); 38 | 39 | }); 40 | 41 | }; 42 | 43 | })( jQuery ); 44 | -------------------------------------------------------------------------------- /registration/resources/nametag/furrydelphia/jquery.fittext.js: -------------------------------------------------------------------------------- 1 | /*global jQuery */ 2 | /*! 3 | * FitText.js 1.2 4 | * 5 | * Copyright 2011, Dave Rupert http://daverupert.com 6 | * Released under the WTFPL license 7 | * http://sam.zoy.org/wtfpl/ 8 | * 9 | * Date: Thu May 05 14:23:00 2011 -0600 10 | */ 11 | 12 | (function( $ ){ 13 | 14 | $.fn.fitText = function( kompressor, options ) { 15 | 16 | // Setup options 17 | var compressor = kompressor || 1, 18 | settings = $.extend({ 19 | 'minFontSize' : Number.NEGATIVE_INFINITY, 20 | 'maxFontSize' : Number.POSITIVE_INFINITY 21 | }, options); 22 | 23 | return this.each(function(){ 24 | 25 | // Store the object 26 | var $this = $(this); 27 | 28 | // Resizer() resizes items based on the object width divided by the compressor * 10 29 | var resizer = function () { 30 | $this.css('font-size', Math.max(Math.min($this.width() / (compressor*10), parseFloat(settings.maxFontSize)), parseFloat(settings.minFontSize))); 31 | }; 32 | 33 | // Call once to set. 34 | resizer(); 35 | 36 | // Call on resize. Opera debounces their resize by default. 37 | $(window).on('resize.fittext orientationchange.fittext', resizer); 38 | 39 | }); 40 | 41 | }; 42 | 43 | })( jQuery ); 44 | -------------------------------------------------------------------------------- /registration/migrations/0035_auto_20161228_1940.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-12-29 00:40 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0034_auto_20161227_1230"), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name="staff", 18 | name="contactRelation", 19 | field=models.CharField(blank=True, max_length=200), 20 | ), 21 | migrations.AddField( 22 | model_name="staff", 23 | name="shirtsize", 24 | field=models.ForeignKey( 25 | blank=True, 26 | null=True, 27 | on_delete=django.db.models.deletion.SET_NULL, 28 | to="registration.ShirtSizes", 29 | ), 30 | ), 31 | migrations.AlterField( 32 | model_name="staff", 33 | name="attendee", 34 | field=models.ForeignKey( 35 | blank=True, 36 | null=True, 37 | on_delete=django.db.models.deletion.SET_NULL, 38 | to="registration.Attendee", 39 | ), 40 | ), 41 | ] 42 | -------------------------------------------------------------------------------- /registration/migrations/0080_cart.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-10-04 17:44 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0079_pricelevel_isminor"), 12 | ] 13 | 14 | operations = [ 15 | migrations.CreateModel( 16 | name="Cart", 17 | fields=[ 18 | ( 19 | "id", 20 | models.AutoField( 21 | auto_created=True, 22 | primary_key=True, 23 | serialize=False, 24 | verbose_name="ID", 25 | ), 26 | ), 27 | ("token", models.CharField(blank=True, max_length=200, null=True)), 28 | ("form", models.CharField(max_length=50)), 29 | ("formData", models.TextField()), 30 | ("formHeaders", models.TextField()), 31 | ("enteredDate", models.DateTimeField(auto_now_add=True, null=True)), 32 | ("transferedDate", models.DateTimeField(auto_now_add=True, null=True)), 33 | ("ipAddress", models.CharField(max_length=50)), 34 | ], 35 | ), 36 | ] 37 | -------------------------------------------------------------------------------- /registration/migrations/0066_temptoken.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-05-12 15:25 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | import registration.models 8 | 9 | 10 | class Migration(migrations.Migration): 11 | 12 | dependencies = [ 13 | ("registration", "0065_auto_20180425_2022"), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name="TempToken", 19 | fields=[ 20 | ( 21 | "id", 22 | models.AutoField( 23 | auto_created=True, 24 | primary_key=True, 25 | serialize=False, 26 | verbose_name="ID", 27 | ), 28 | ), 29 | ( 30 | "token", 31 | models.CharField( 32 | default=registration.models.getRegistrationToken, max_length=200 33 | ), 34 | ), 35 | ("email", models.CharField(max_length=200)), 36 | ("validUntil", models.DateField(auto_now_add=True)), 37 | ("used", models.BooleanField(default=False)), 38 | ("usedDate", models.DateField()), 39 | ], 40 | ), 41 | ] 42 | -------------------------------------------------------------------------------- /registration/frontend/src/admin/scan/components/ScanPii.tsx: -------------------------------------------------------------------------------- 1 | import { differenceInYears } from "date-fns/differenceInYears"; 2 | import { Component } from "solid-js"; 3 | 4 | import { ShcMatch } from ".."; 5 | import { MismatchedData } from "./MismatchedData"; 6 | 7 | export const NameBirthday: Component<{ 8 | name: string; 9 | birthday: string; 10 | shcMatch?: ShcMatch; 11 | }> = (props) => { 12 | const age = () => { 13 | return differenceInYears(new Date(), props.birthday); 14 | }; 15 | 16 | return ( 17 |
    18 |
    19 | 23 | {props.name} 24 | 25 |
    26 |
    27 | 31 | 32 | 33 | 34 | 35 | {`${props.birthday} (${age()} years)`} 36 | 37 | 38 |
    39 |
    40 | ); 41 | }; 42 | -------------------------------------------------------------------------------- /registration/frontend/src/admin/attendee-search/components/BadgeTableLoader.tsx: -------------------------------------------------------------------------------- 1 | import { Component, For } from "solid-js"; 2 | 3 | export const BadgeTableLoader: Component<{ count?: number }> = (props) => { 4 | return ( 5 | 6 | {(_, index) => } 7 | 8 | ); 9 | }; 10 | 11 | const Row: Component = () => { 12 | return ( 13 | 14 | 15 |
    16 |
    Longer Full Name
    17 |
    18 | 19 | 20 |
    21 |
    Badge
    22 |
    23 | 24 | 25 |
    26 |
    Status
    27 |
    28 | 29 | 30 |
    31 | 32 | 33 | 34 | 35 | 36 | 37 | 42 |
    43 | 44 | 45 | ); 46 | }; 47 | -------------------------------------------------------------------------------- /registration/templatetags/registration_tags.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from django.utils.timezone import timedelta 3 | 4 | register = template.Library() 5 | 6 | 7 | @register.inclusion_tag("templatetags/basic_attendee_form.html") 8 | def show_attendee_form(*args, **kwargs): 9 | return kwargs 10 | 11 | 12 | @register.inclusion_tag("templatetags/online_price_types.html") 13 | def show_price_types(*args, **kwargs): 14 | return kwargs 15 | 16 | 17 | @register.inclusion_tag("templatetags/basic_staff_form.html") 18 | def show_staff_form(*args, **kwargs): 19 | return kwargs 20 | 21 | 22 | @register.simple_tag 23 | def attendee_get_first(attendee): 24 | firstName = attendee.get("firstName", "") 25 | preferredName = attendee.get("preferredName") 26 | 27 | if preferredName: 28 | return preferredName 29 | return firstName 30 | 31 | 32 | @register.filter 33 | def get_value(dictionary, key): 34 | return dictionary.get(key) 35 | 36 | 37 | @register.simple_tag 38 | def selected_if_month(date, value): 39 | if hasattr(date, "month") and date.month == value: 40 | return "selected" 41 | return "" 42 | 43 | 44 | @register.simple_tag 45 | def subtract_years(date, years): 46 | return date.replace(year=date.year - years).strftime("%B %e, %Y") 47 | 48 | 49 | @register.simple_tag 50 | def venue_country(event): 51 | if event.venue: 52 | return event.venue.country 53 | else: 54 | return "" 55 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "apis" 3 | version = "0.25.0" 4 | description = "Attendee registration software for fan conventions" 5 | readme = "README.md" 6 | requires-python = ">=3.11" 7 | dependencies = [ 8 | "beautifulsoup4>=4.12.3", 9 | "configobj>=5.0.9", 10 | "django>=3.2.24,<4", 11 | "django-admin-env-notice~=0.4", 12 | "django-extensions~=3.2.3", 13 | "django-idempotency-key~=1.3.0", 14 | "django-import-export~=3.3.7", 15 | "django-maintenance-mode==0.21.1", 16 | "django-mathfilters~=1.0.0", 17 | "django-nested-admin>=4.1.1", 18 | "django-nested-inline~=0.4.6", 19 | "django-prometheus~=2.3.1", 20 | "django-redis~=5.4.0", 21 | "django-u2f", 22 | "django-widget-tweaks~=1.5.0", 23 | "freezegun>=1.4.0", 24 | "gotenberg-client~=0.7.0", 25 | "influxdb~=5.3.1", 26 | "influxdb-client~=1.40.0", 27 | "markuppy>=1.14", 28 | "paho-mqtt~=1.6.1", 29 | "pillow>=5.3", 30 | "psycopg2-binary>=2.9.9", 31 | "pygments~=2.18.0", 32 | "pyjwt~=2.8.0", 33 | "pytz~=2024.1", 34 | "qrcode~=7.4.2", 35 | "respx>=0.22.0", 36 | "sentry-sdk>=2.21.0", 37 | "soupsieve>=2.6", 38 | "squareup==22.0.0.20220921", 39 | ] 40 | 41 | [tool.uv.sources] 42 | django-u2f = { git = "https://github.com/rechner/django-u2f.git", rev = "23022f80ae4af831e3533464a0b54e6ec46b2ca1" } 43 | 44 | [dependency-groups] 45 | dev = [ 46 | "django-debug-toolbar~=4.3.0", 47 | "ruff>=0.9.6", 48 | ] 49 | -------------------------------------------------------------------------------- /registration/migrations/0003_auto_20160727_0114.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-07-27 01:14 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0002_auto_20160726_2342"), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name="attendee", 18 | name="badgeNumber", 19 | field=models.IntegerField(blank=True, null=True), 20 | ), 21 | migrations.AlterField( 22 | model_name="attendee", 23 | name="holdType", 24 | field=models.ForeignKey( 25 | blank=True, 26 | null=True, 27 | on_delete=django.db.models.deletion.SET_NULL, 28 | to="registration.HoldType", 29 | ), 30 | ), 31 | migrations.AlterField( 32 | model_name="attendee", 33 | name="notes", 34 | field=models.TextField(blank=True), 35 | ), 36 | migrations.AlterField( 37 | model_name="attendee", 38 | name="parent", 39 | field=models.ForeignKey( 40 | blank=True, 41 | null=True, 42 | on_delete=django.db.models.deletion.SET_NULL, 43 | to="registration.Attendee", 44 | ), 45 | ), 46 | ] 47 | -------------------------------------------------------------------------------- /.github/workflows/docker.yml: -------------------------------------------------------------------------------- 1 | name: Build & Deploy 2 | 3 | on: 4 | # Manually triggered from the UI 5 | workflow_dispatch: 6 | inputs: 7 | environment: 8 | description: "Environment" 9 | required: true 10 | type: environment 11 | 12 | # Dependency to a forking workflow 13 | #workflow_run: 14 | # workflows: ["Django CI"] 15 | # types: [completed] 16 | 17 | jobs: 18 | build_docker: 19 | runs-on: ubuntu-latest 20 | environment: ${{ github.event.inputs.environment }} 21 | concurrency: ${{ github.event.inputs.environment }} 22 | steps: 23 | - uses: actions/checkout@v4 24 | - name: Login to packages container registry 25 | uses: docker/login-action@v3 26 | with: 27 | registry: ghcr.io 28 | username: ${{ github.actor }} 29 | password: ${{ secrets.GITHUB_TOKEN }} 30 | 31 | - name: Build image 32 | run: | 33 | make build-docker-image 34 | make tag-${{ github.event.inputs.environment }} 35 | 36 | - name: Deploy to server 37 | uses: appleboy/ssh-action@master 38 | with: 39 | host: maaa-registration 40 | username: ${{ secrets.SSH_USERNAME }} 41 | key: ${{ secrets.SSH_PRIVATE_KEY }} 42 | proxy_host: ${{ secrets.SSH_HOST }} 43 | proxy_username: ${{ secrets.SSH_USERNAME }} 44 | proxy_key: ${{ secrets.SSH_PRIVATE_KEY }} 45 | script: | 46 | cd /opt/docker 47 | docker-compose pull 48 | docker-compose up -d 49 | -------------------------------------------------------------------------------- /registration/migrations/0108_update_pricelevels.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.25 on 2025-02-20 05:33 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('registration', '0107_mqtt_printing_per_terminal'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='pricelevel', 15 | name='accompanied', 16 | field=models.BooleanField(default=False), 17 | ), 18 | migrations.AddField( 19 | model_name='pricelevel', 20 | name='min_age', 21 | field=models.IntegerField(default=0), 22 | ), 23 | migrations.AddField( 24 | model_name='pricelevel', 25 | name='max_age', 26 | field=models.IntegerField(blank=True, help_text='Leave blank for no limit', null=True), 27 | ), 28 | migrations.AddField( 29 | model_name='pricelevel', 30 | name='available_to_attendee', 31 | field=models.BooleanField(default=False, verbose_name='Attendee'), 32 | ), 33 | migrations.AddField( 34 | model_name='pricelevel', 35 | name='available_to_marketplace', 36 | field=models.BooleanField(default=False, verbose_name='Marketplace'), 37 | ), 38 | migrations.AddField( 39 | model_name='pricelevel', 40 | name='available_to_staff', 41 | field=models.BooleanField(default=False, verbose_name='Staff'), 42 | ), 43 | ] 44 | -------------------------------------------------------------------------------- /registration/templates/templatetags/coc_sig.html: -------------------------------------------------------------------------------- 1 | {% load registration_tags static %} 2 | 3 |
    4 |
    5 | 12 |
    13 |
    14 |
    15 |
    Please Sign Below:
    16 |
    21 |
    22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /registration/migrations/0084_reservedbadgenumbers.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.27 on 2020-02-09 02:21 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0083_auto_20200207_0355"), 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name="ReservedBadgeNumbers", 18 | fields=[ 19 | ( 20 | "id", 21 | models.AutoField( 22 | auto_created=True, 23 | primary_key=True, 24 | serialize=False, 25 | verbose_name="ID", 26 | ), 27 | ), 28 | ("badgeNumber", models.IntegerField()), 29 | ("notes", models.TextField(blank=True)), 30 | ( 31 | "event", 32 | models.ForeignKey( 33 | on_delete=django.db.models.deletion.CASCADE, 34 | to="registration.Event", 35 | ), 36 | ), 37 | ( 38 | "priceLevel", 39 | models.ForeignKey( 40 | null=True, 41 | on_delete=django.db.models.deletion.SET_NULL, 42 | to="registration.PriceLevel", 43 | ), 44 | ), 45 | ], 46 | ), 47 | ] 48 | -------------------------------------------------------------------------------- /registration/migrations/0103_auto_20241109_1543.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.25 on 2024-11-09 20:43 2 | 3 | from django.db import migrations, models 4 | import django.db.models.deletion 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('registration', '0102_event_dealer_wifi_partner_price'), 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name='BadgeTemplate', 16 | fields=[ 17 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 18 | ('name', models.CharField(max_length=100)), 19 | ('template', models.TextField()), 20 | ('paperWidth', models.CharField(max_length=10, null=True)), 21 | ('paperHeight', models.CharField(max_length=10, null=True)), 22 | ('marginTop', models.CharField(max_length=10, null=True)), 23 | ('marginBottom', models.CharField(max_length=10, null=True)), 24 | ('marginLeft', models.CharField(max_length=10, null=True)), 25 | ('marginRight', models.CharField(max_length=10, null=True)), 26 | ('landscape', models.BooleanField(default=True)), 27 | ('scale', models.FloatField(default=1.0)), 28 | ], 29 | ), 30 | migrations.AddField( 31 | model_name='event', 32 | name='defaultBadgeTemplate', 33 | field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='registration.badgetemplate'), 34 | ), 35 | ] 36 | -------------------------------------------------------------------------------- /registration/static/js/date-entry.js: -------------------------------------------------------------------------------- 1 | function daysInMonth(month, year) { 2 | return new Date(year, month, 0).getDate(); 3 | } 4 | 5 | $(document).ready(function (e) { 6 | $('#byear, #bmonth').change(function () { 7 | 8 | if ($('#byear').val().length > 0 && $('#bmonth').val().length > 0) { 9 | $('#bday').prop('disabled', false); 10 | $('#bday').find('option').remove(); 11 | 12 | const daysInSelectedMonth = daysInMonth($('#bmonth').val(), $('#byear').val()); 13 | 14 | for (let i = 1; i <= daysInSelectedMonth; i++) { 15 | let day; 16 | if (i < 10) { 17 | day = "0" + i; 18 | } else { 19 | day = i; 20 | } 21 | $('#bday').append($("").attr("value", day).text(i)); 22 | } 23 | 24 | } else { 25 | $('#bday').prop('disabled', true); 26 | } 27 | 28 | }); 29 | 30 | $('#byear, #bmonth, #bday').change(function () { 31 | const bday = $('#byear').val() + "-" + $('#bmonth').val() + "-" + $('#bday').val(); 32 | $('#birthDate').val(bday); 33 | }); 34 | 35 | // Populate from passed in hidden field 36 | let dob = $("#birthDate").val(); 37 | if (dob === undefined) { 38 | return; 39 | } 40 | let [year, month, day] = dob.split('-'); 41 | if (year && month && day) { 42 | $("#byear").val(year); 43 | $("#bmonth").val(month); 44 | $('#bmonth').change(); 45 | $("#bday").val(day); 46 | $("#bday").change(); 47 | } 48 | }); 49 | -------------------------------------------------------------------------------- /templates/u2f/totp_device.html: -------------------------------------------------------------------------------- 1 | {% extends "u2f/base.html" %} 2 | {% load widget_tweaks %} 3 | {% load i18n %} 4 | {% block title %}{% trans "Add TOTP Device" %}{% endblock title %} 5 | 6 | {% block content %} 7 | {{ block.super }} 8 |
    9 |
    10 |

    Two Factor Settings

    11 |

    {% trans 'Scan this in your authenticator app:' %}

    12 | 13 |
    14 | {{ qr_svg|safe }} 15 |
    16 | 17 |

    18 | {% trans "Or, if you can't scan a QR Code, enter this key as a time-based account:" %} {{ base32_key }} 19 |

    20 | 21 |

    22 | {% trans 'Then, enter the token it gives you.' %} 23 |

    24 | 25 |
    26 | {% csrf_token %} 27 | 28 | {% for hidden_field in form.hidden_fields %} 29 | {{ hidden_field }} 30 | {% endfor %} 31 | 32 | 33 | {% for field in form.visible_fields %} 34 |
    35 | {{ field.label_tag }} 36 | {% render_field field class="form-control" autofocus="autofocus" %} 37 | {% if field.help_text %} 38 | {{ field.help_text }} 39 | {% endif %} 40 |
    41 | {% endfor %} 42 | 43 | 44 |
    45 |
    46 |
    47 | 48 | {% endblock %} 49 | -------------------------------------------------------------------------------- /registration/migrations/0018_auto_20161010_1838.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2016-10-10 22:38 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0017_auto_20161009_1154"), 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name="Jersey", 18 | fields=[ 19 | ( 20 | "id", 21 | models.AutoField( 22 | auto_created=True, 23 | primary_key=True, 24 | serialize=False, 25 | verbose_name="ID", 26 | ), 27 | ), 28 | ("name", models.CharField(max_length=50)), 29 | ("number", models.IntegerField()), 30 | ( 31 | "shirtSize", 32 | models.ForeignKey( 33 | on_delete=django.db.models.deletion.CASCADE, 34 | to="registration.ShirtSizes", 35 | ), 36 | ), 37 | ], 38 | ), 39 | migrations.RemoveField( 40 | model_name="attendeeoptions", 41 | name="optionValue2", 42 | ), 43 | migrations.RemoveField( 44 | model_name="priceleveloption", 45 | name="unique", 46 | ), 47 | migrations.RemoveField( 48 | model_name="priceleveloption", 49 | name="valueCount", 50 | ), 51 | ] 52 | -------------------------------------------------------------------------------- /example.env: -------------------------------------------------------------------------------- 1 | # NOTE: There is no special handling of quotation marks. 2 | # XXX This means that they are part of the VAL XXX 3 | 4 | # Contact information 5 | #APIS_ADMIN_EMAIL_HANDLER=1 # Uncomment to be emailed about application errors at the address below. 6 | APIS_ADMIN_NAME=George 7 | APIS_ADMIN_EMAIL=admin@example.com 8 | APIS_DEFAULT_EMAIL=registration@example.com 9 | 10 | # Django 11 | DJANGO_SECRET_KEY=supersecretcrypt 12 | DJANGO_LOGLEVEL=info 13 | # Don't run with debug in production! 14 | DJANGO_DEBUG=1 15 | DJANGO_SERVER_EMAIL=no-reply@example.com 16 | TZ=America/New_York 17 | 18 | DATABASE_HOST=postgres 19 | DATABASE_NAME=apis 20 | DATABASE_USER=apis 21 | DATABASE_PASS=secret 22 | #DATABASE_PORT 23 | 24 | # Admin environment banner 25 | ENVIRONMENT_NAME=Production Server 26 | ENVIRONMENT_COLOR=#FF0000 27 | ENVIRONMENT_TEXT_COLOR=#00FF00 28 | ENVIRONMENT_FLOAT=True 29 | 30 | # Square 31 | SQUARE_APPLICATION_ID=sandbox-sq0i-..... 32 | SQUARE_ACCESS_TOKEN=AAA... 33 | SQUARE_LOCATION_ID=... 34 | SQUARE_CURRENCY=USD 35 | # sandbox or production 36 | SQUARE_ENVIRONMENT=sandbox 37 | SQUARE_WEBHOOK_SIGNATURE_KEY=asdf1234... 38 | 39 | # Email 40 | EMAIL_HOST=localhost 41 | EMAIL_PORT=25 42 | EMAIL_HOST_USER=noreply@example.org 43 | EMAIL_HOST_PASSWORD=secret 44 | EMAIL_USE_TLS=false 45 | 46 | # Register Android app 47 | #REGISTER_SQUARE_LOCATION= 48 | #REGISTER_ENDPOINT= 49 | #REGISTER_DEFAULT_WEBVIEW= 50 | 51 | # MQTT (browser/receipt printing push notifications). 52 | MQTT_EXTERNAL_BROKER=wss://mqtt.example.com/mqtt 53 | # Secret must be base64-encoded 54 | MQTT_JWT_SECRET=secret== 55 | MQTT_BROKER_HOST=localhost 56 | MQTT_BROKER_PORT=1883 57 | MQTT_BROKER_TLS=false 58 | -------------------------------------------------------------------------------- /registration/migrations/0060_auto_20180315_1852.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-03-15 22:52 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0059_attendee_aslrequest"), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name="event", 18 | name="dealerAsstDiscount", 19 | field=models.ForeignKey( 20 | blank=True, 21 | null=True, 22 | on_delete=django.db.models.deletion.SET_NULL, 23 | related_name="dealerAsstDiscount_event", 24 | to="registration.Discount", 25 | ), 26 | ), 27 | migrations.AddField( 28 | model_name="event", 29 | name="dealerDiscount", 30 | field=models.ForeignKey( 31 | blank=True, 32 | null=True, 33 | on_delete=django.db.models.deletion.SET_NULL, 34 | related_name="dealerDiscount_event", 35 | to="registration.Discount", 36 | ), 37 | ), 38 | migrations.AddField( 39 | model_name="event", 40 | name="staffDiscount", 41 | field=models.ForeignKey( 42 | blank=True, 43 | null=True, 44 | on_delete=django.db.models.deletion.SET_NULL, 45 | related_name="staffDiscount_event", 46 | to="registration.Discount", 47 | ), 48 | ), 49 | ] 50 | -------------------------------------------------------------------------------- /registration/migrations/0098_auto_20230124_2055.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.16 on 2023-01-25 01:55 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('registration', '0097_temptoken_ignore_time_window'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='event', 15 | name='attendeeRegEnd', 16 | field=models.DateTimeField(verbose_name='Online Attendee Registration End'), 17 | ), 18 | migrations.AlterField( 19 | model_name='event', 20 | name='attendeeRegStart', 21 | field=models.DateTimeField(verbose_name='Online Attendee Registration Start'), 22 | ), 23 | migrations.AlterField( 24 | model_name='event', 25 | name='dealerRegStart', 26 | field=models.DateTimeField(verbose_name='Dealer Registration Start'), 27 | ), 28 | migrations.AlterField( 29 | model_name='event', 30 | name='onsiteRegEnd', 31 | field=models.DateTimeField(verbose_name='On-Site Registration End'), 32 | ), 33 | migrations.AlterField( 34 | model_name='event', 35 | name='onsiteRegStart', 36 | field=models.DateTimeField(help_text='Start time for /registration/onsite form', verbose_name='On-Site Registration Start'), 37 | ), 38 | migrations.AlterField( 39 | model_name='event', 40 | name='staffRegStart', 41 | field=models.DateTimeField(verbose_name='Staff Registration Start'), 42 | ), 43 | ] 44 | -------------------------------------------------------------------------------- /registration/migrations/0095_add_cash_ledger_actions.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.25 on 2022-02-07 08:23 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | replaces = [ 9 | ("registration", "0095_drop_and_pickup"), 10 | ("registration", "0096_add_cash_adjustment"), 11 | ] 12 | 13 | dependencies = [ 14 | ("registration", "0094_add_preferred_name"), 15 | ] 16 | 17 | operations = [ 18 | migrations.AlterField( 19 | model_name="cashdrawer", 20 | name="action", 21 | field=models.CharField( 22 | choices=[ 23 | ("Open", "Open"), 24 | ("Close", "Close"), 25 | ("Transaction", "Transaction"), 26 | ("Deposit", "Deposit"), 27 | ("Drop", "Drop"), 28 | ("Pickup", "Pickup"), 29 | ], 30 | default="Open", 31 | max_length=20, 32 | ), 33 | ), 34 | migrations.AlterField( 35 | model_name="cashdrawer", 36 | name="action", 37 | field=models.CharField( 38 | choices=[ 39 | ("Open", "Open"), 40 | ("Close", "Close"), 41 | ("Transaction", "Transaction"), 42 | ("Deposit", "Deposit"), 43 | ("Drop", "Drop"), 44 | ("Pickup", "Pickup"), 45 | ("Adjustment", "Adjustment"), 46 | ], 47 | default="Open", 48 | max_length=20, 49 | ), 50 | ), 51 | ] 52 | -------------------------------------------------------------------------------- /registration/frontend/src/admin/providers/user-settings-provider.tsx: -------------------------------------------------------------------------------- 1 | import { Accessor, createContext, createSignal, Setter } from "solid-js"; 2 | 3 | const STORAGE_KEY = "user-settings"; 4 | 5 | export type UserSettingKey = 6 | | "clear_cart_after_print" 7 | | "container_fluid" 8 | | "print_after_payment" 9 | | "search_birthday"; 10 | 11 | export type UserSettings = Record; 12 | 13 | const USER_DEFAULTS: UserSettings = { 14 | clear_cart_after_print: false, 15 | container_fluid: false, 16 | print_after_payment: true, 17 | search_birthday: true, 18 | }; 19 | 20 | export class UserSettingsManager { 21 | public userSettings: Accessor; 22 | private setUserSettings: Setter; 23 | 24 | constructor() { 25 | const settingsData = window.localStorage.getItem(STORAGE_KEY); 26 | let settings: UserSettings; 27 | 28 | if (settingsData) { 29 | try { 30 | settings = { ...USER_DEFAULTS, ...JSON.parse(settingsData) }; 31 | } catch (err) { 32 | console.error(`Could not parse settings: ${err}`); 33 | settings = USER_DEFAULTS; 34 | } 35 | } else { 36 | settings = USER_DEFAULTS; 37 | } 38 | 39 | [this.userSettings, this.setUserSettings] = 40 | createSignal(settings); 41 | } 42 | 43 | private saveSettings() { 44 | const data = JSON.stringify(this.userSettings()); 45 | window.localStorage.setItem(STORAGE_KEY, data); 46 | } 47 | 48 | store(setting: UserSettingKey, value: any) { 49 | this.setUserSettings({ ...this.userSettings(), [setting]: value }); 50 | this.saveSettings(); 51 | } 52 | } 53 | 54 | export const UserSettingsContext = createContext(); 55 | -------------------------------------------------------------------------------- /registration/templates/registration/utility/viplist.html: -------------------------------------------------------------------------------- 1 | {% extends "registration/utility_pages.html" %} 2 | {% load registration_tags %} 3 | {% block content %} 4 | 5 |

    VIP Attendees

    6 |

    {{ event }}

    7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | {% for b in badges %} 23 | 24 | 25 | 26 | 27 | 28 | 33 | 34 | 35 | 46 | 47 | {% endfor %} 48 | 49 |
    LevelStatusBadge NameLegal NameAddressPhoneEmailOptions
    {{ b.level }}{{ b.assoc }}{{ b.badge.badgeName }}{{ b.badge.attendee.firstName }} {{ b.badge.attendee.lastName }}{{ b.badge.attendee.address1 }}
    29 | {{ b.badge.attendee.address2 }}
    30 | {{ b.badge.attendee.city }}, {{ b.badge.attendee.state }} {{ b.badge.attendee.postalCode }}
    31 | {{ b.badge.attendee.country }} 32 |
    {{ b.badge.attendee.phone }}{{ b.badge.attendee.email }} 36 | {% for oi in b.orderItems %} 37 | {% if oi.type == "ShirtSizes" %} 38 | {{ oi.name }} - {{ shirt_sizes|get_value:oi.value }} 39 | {% else %} 40 | {{ oi.name }} - {{ oi.value }} 41 | {% endif %} 42 |
    43 | {% endfor %} 44 | 45 |
    50 | 51 | {% endblock %} 52 | -------------------------------------------------------------------------------- /registration/migrations/0092_auto_20211219_0409_squashed_0093_auto_20211219_0436.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.25 on 2021-12-20 07:38 2 | 3 | import django.db.models.deletion 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ("registration", "0091_alter_firebase_webview"), 11 | ] 12 | 13 | operations = [ 14 | migrations.CreateModel( 15 | name="Venue", 16 | fields=[ 17 | ( 18 | "id", 19 | models.AutoField( 20 | auto_created=True, 21 | primary_key=True, 22 | serialize=False, 23 | verbose_name="ID", 24 | ), 25 | ), 26 | ("name", models.CharField(blank=True, max_length=200)), 27 | ("address", models.CharField(blank=True, max_length=200)), 28 | ("website", models.CharField(blank=True, max_length=500)), 29 | ("city", models.CharField(blank=True, max_length=200)), 30 | ("country", models.CharField(blank=True, max_length=200)), 31 | ("postalCode", models.CharField(blank=True, max_length=20)), 32 | ("state", models.CharField(blank=True, max_length=200)), 33 | ], 34 | ), 35 | migrations.AddField( 36 | model_name="event", 37 | name="venue", 38 | field=models.ForeignKey( 39 | blank=True, 40 | null=True, 41 | on_delete=django.db.models.deletion.SET_NULL, 42 | to="registration.Venue", 43 | ), 44 | ), 45 | ] 46 | -------------------------------------------------------------------------------- /templates/registration/password_change_form.html: -------------------------------------------------------------------------------- 1 | {% extends "registration/password_change_form.html" %} 2 | {% load i18n static %} 3 | 4 | {% block content %}
    5 | 6 |
    {% csrf_token %} 7 |
    8 | {% if form.errors %} 9 |

    10 | {% if form.errors.items|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %} 11 |

    12 | {% endif %} 13 | 14 | 15 |

    {% trans "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly." %}

    16 | 17 |
    18 | 19 |
    20 | {{ form.old_password.errors }} 21 | {{ form.old_password.label_tag }} {{ form.old_password }} 22 |
    23 | 24 |
    25 | {{ form.new_password1.errors }} 26 | {{ form.new_password1.label_tag }} {{ form.new_password1 }} 27 | {% if form.new_password1.help_text %} 28 |
    {{ form.new_password1.help_text|safe }}
    29 | {% endif %} 30 |
    31 | 32 |
    33 | {{ form.new_password2.errors }} 34 | {{ form.new_password2.label_tag }} {{ form.new_password2 }} 35 | {% if form.new_password2.help_text %} 36 |
    {{ form.new_password2.help_text|safe }}
    37 | {% endif %} 38 |
    39 | 40 |
    41 | 42 |

    43 | Secure your account by turning on Two-Factor Authentication

    44 |

    45 | 46 |
    47 | 48 |
    49 | 50 |
    51 |
    52 | 53 | {% endblock %} 54 | -------------------------------------------------------------------------------- /registration/migrations/0053_auto_20170916_1047.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.9.8 on 2017-09-16 14:47 3 | 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0052_auto_20170715_1734"), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name="jersey", 17 | name="shirtSize", 18 | ), 19 | migrations.RemoveField( 20 | model_name="staffjersey", 21 | name="shirtSize", 22 | ), 23 | migrations.RemoveField( 24 | model_name="attendee", 25 | name="badgeName", 26 | ), 27 | migrations.RemoveField( 28 | model_name="attendee", 29 | name="badgeNumber", 30 | ), 31 | migrations.RemoveField( 32 | model_name="attendee", 33 | name="badgePrinted", 34 | ), 35 | migrations.RemoveField( 36 | model_name="attendee", 37 | name="event", 38 | ), 39 | migrations.RemoveField( 40 | model_name="attendee", 41 | name="printed", 42 | ), 43 | migrations.RemoveField( 44 | model_name="attendee", 45 | name="registeredDate", 46 | ), 47 | migrations.RemoveField( 48 | model_name="attendee", 49 | name="registrationToken", 50 | ), 51 | migrations.RemoveField( 52 | model_name="orderitem", 53 | name="attendee", 54 | ), 55 | migrations.DeleteModel( 56 | name="Jersey", 57 | ), 58 | migrations.DeleteModel( 59 | name="StaffJersey", 60 | ), 61 | ] 62 | -------------------------------------------------------------------------------- /registration/migrations/0086_rename_tables.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.17 on 2020-02-17 07:15 3 | 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ("registration", "0085_auto_20200215_1029_squashed_0086_auto_20200215_1051"), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterModelTable( 16 | name="attendeeoptions", 17 | table="registration_attendee_options", 18 | ), 19 | migrations.AlterModelTable( 20 | name="banlist", 21 | table="registration_ban_list", 22 | ), 23 | migrations.AlterModelTable( 24 | name="dealerasst", 25 | table="registration_dealer_asst", 26 | ), 27 | migrations.AlterModelTable( 28 | name="orderitem", 29 | table="registration_order_item", 30 | ), 31 | migrations.AlterModelTable( 32 | name="pricelevel", 33 | table="registration_price_level", 34 | ), 35 | migrations.AlterModelTable( 36 | name="priceleveloption", 37 | table="registration_price_level_option", 38 | ), 39 | migrations.AlterModelTable( 40 | name="reservedbadgenumbers", 41 | table="registration_reserved_badge_numbers", 42 | ), 43 | migrations.AlterModelTable( 44 | name="shirtsizes", 45 | table="registration_shirt_sizes", 46 | ), 47 | migrations.AlterModelTable( 48 | name="tablesize", 49 | table="registration_table_size", 50 | ), 51 | migrations.AlterModelTable( 52 | name="temptoken", 53 | table="registration_temp_token", 54 | ), 55 | ] 56 | -------------------------------------------------------------------------------- /registration/migrations/0096_square_webhooks.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.16 on 2022-12-29 07:11 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | def blank_to_null(apps, schema_editor): 7 | Order = apps.get_model("registration", "Order") 8 | for order in Order.objects.filter(apiData=""): 9 | order.apiData = None 10 | order.save() 11 | 12 | 13 | class Migration(migrations.Migration): 14 | 15 | dependencies = [ 16 | ("registration", "0095_add_cash_ledger_actions"), 17 | ] 18 | 19 | operations = [ 20 | migrations.CreateModel( 21 | name="PaymentWebhookNotification", 22 | fields=[ 23 | ( 24 | "id", 25 | models.AutoField( 26 | auto_created=True, 27 | primary_key=True, 28 | serialize=False, 29 | verbose_name="ID", 30 | ), 31 | ), 32 | ("integration", models.CharField(default="square", max_length=50)), 33 | ("event_id", models.UUIDField(unique=True)), 34 | ("timestamp", models.DateTimeField(auto_now_add=True)), 35 | ("body", models.JSONField(verbose_name="Webhook body")), 36 | ("headers", models.JSONField(verbose_name="Webhook headers")), 37 | ], 38 | ), 39 | migrations.AlterField( 40 | model_name="order", 41 | name="apiData", 42 | field=models.TextField(null=True, blank=True), 43 | ), 44 | migrations.RunPython(blank_to_null), 45 | migrations.AlterField( 46 | model_name="order", 47 | name="apiData", 48 | field=models.JSONField(null=True), 49 | ), 50 | ] 51 | -------------------------------------------------------------------------------- /registration/static/js/checkout.js: -------------------------------------------------------------------------------- 1 | async function formatError(response) { 2 | try { 3 | const r = await response.json(); 4 | return r.reason; 5 | } catch (e) { 6 | return "Unknown" 7 | } 8 | } 9 | 10 | function showAlert(html) { 11 | const alertDiv = document.getElementById('alert-bar'); 12 | alertDiv.innerHTML = html; 13 | alertDiv.classList.remove('alert-hidden'); 14 | } 15 | 16 | function hideAlert() { 17 | const alertDiv = document.getElementById('alert-bar'); 18 | alertDiv.classList.add('alert-hidden'); 19 | } 20 | 21 | let addresses = []; 22 | $("body").ready(function () { 23 | if (EVENT_COLLECT_ADDRESS) { 24 | $.getJSON(URL_REGISTRATION_ADDRESSES, function (data) { 25 | addresses = data; 26 | }); 27 | 28 | $("#useFrom").on("change", function (e) { 29 | const userId = $(this).val(); 30 | if (userId == "") { 31 | $("#fname").val(""); 32 | $("#lname").val(""); 33 | $("#email").val(""); 34 | $("#add1").val(""); 35 | $("#add2").val(""); 36 | $("#city").val(""); 37 | $("#state").val(""); 38 | $("#country").val(""); 39 | return; 40 | } 41 | 42 | const address = addresses[userId]; 43 | $("#fname").val(address.fname); 44 | $("#lname").val(address.lname); 45 | $("#email").val(address.email); 46 | $("#add1").val(address.address1); 47 | $("#add2").val(address.address2); 48 | $("#city").val(address.city); 49 | $("#state").val(address.state); 50 | $("#postal").val(address.postalCode); 51 | $("#country").val(address.country); 52 | }); 53 | } 54 | }); -------------------------------------------------------------------------------- /registration/templatetags/site.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import datetime 3 | import uuid 4 | 5 | from django import template 6 | from django.contrib.sites.models import Site 7 | 8 | register = template.Library() 9 | 10 | 11 | @register.simple_tag 12 | def current_domain(): 13 | return Site.objects.get_current().domain 14 | 15 | 16 | @register.simple_tag 17 | def current_site_name(): 18 | return Site.objects.get_current().name 19 | 20 | 21 | @register.simple_tag 22 | def bootstrap_message(msg): 23 | """ 24 | Translates Django message tags into bootstrap alert classes 25 | """ 26 | bootstrap = { 27 | "debug": "alert-info", 28 | "info": "alert-info", 29 | "success": "alert-success", 30 | "warning": "alert-warning", 31 | "error": "alert-danger", 32 | } 33 | 34 | if msg not in list(bootstrap.keys()): 35 | return "" 36 | 37 | return bootstrap[msg] 38 | 39 | 40 | @register.simple_tag 41 | def js_date(date): 42 | return "Date({0}, {1}, {2})".format(date.year, date.month - 1, date.day) 43 | 44 | 45 | @register.simple_tag 46 | def event_start_date(event, freeze_time=None): 47 | """ 48 | Returns a "sliding" event date: 49 | event.startDate if startDate is in the future, otherwise 50 | today's date, up to the event endDate 51 | 52 | :param freeze_time: For unit testing 53 | :param event: event 54 | :return: javascript-formatted date object 55 | """ 56 | today = freeze_time or datetime.datetime.now().date() 57 | if today < event.eventStart: 58 | return js_date(event.eventStart) 59 | else: 60 | if today > event.eventEnd: 61 | return js_date(event.eventEnd) 62 | return js_date(today) 63 | 64 | 65 | @register.simple_tag 66 | def idempotency_key(): 67 | return str(uuid.uuid4()) 68 | -------------------------------------------------------------------------------- /registration/migrations/0085_auto_20200215_1029_squashed_0086_auto_20200215_1051.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.17 on 2020-02-15 15:56 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | replaces = [ 12 | ("registration", "0085_auto_20200215_1029"), 13 | ("registration", "0086_auto_20200215_1051"), 14 | ] 15 | 16 | dependencies = [ 17 | ("registration", "0084_reservedbadgenumbers"), 18 | ] 19 | 20 | operations = [ 21 | migrations.AlterModelOptions( 22 | name="reservedbadgenumbers", 23 | options={"verbose_name_plural": "Reserved Badge Numbers"}, 24 | ), 25 | migrations.AddField( 26 | model_name="charity", 27 | name="donations", 28 | field=models.DecimalField( 29 | decimal_places=2, 30 | default=0, 31 | help_text="External donations to add to metrics", 32 | max_digits=12, 33 | ), 34 | ), 35 | migrations.AlterField( 36 | model_name="reservedbadgenumbers", 37 | name="priceLevel", 38 | field=models.ForeignKey( 39 | blank=True, 40 | null=True, 41 | on_delete=django.db.models.deletion.SET_NULL, 42 | to="registration.PriceLevel", 43 | ), 44 | ), 45 | migrations.AddField( 46 | model_name="event", 47 | name="donations", 48 | field=models.DecimalField( 49 | decimal_places=2, 50 | default=0, 51 | help_text="External donations to add to metrics ", 52 | max_digits=12, 53 | ), 54 | ), 55 | ] 56 | -------------------------------------------------------------------------------- /registration/migrations/0063_auto_20180419_0210.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.6 on 2018-04-19 06:10 3 | 4 | 5 | import django.db.models.deletion 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ("registration", "0062_auto_20180416_0020"), 13 | ] 14 | 15 | operations = [ 16 | migrations.AddField( 17 | model_name="firebase", 18 | name="cashdrawer", 19 | field=models.BooleanField(default=False), 20 | ), 21 | migrations.AlterField( 22 | model_name="firebase", 23 | name="token", 24 | field=models.CharField(max_length=500), 25 | ), 26 | migrations.AlterField( 27 | model_name="order", 28 | name="billingType", 29 | field=models.CharField( 30 | choices=[ 31 | ("Unpaid", "Unpaid"), 32 | ("Credit", "Credit"), 33 | ("Cash", "Cash"), 34 | ("Comp", "Comp"), 35 | ], 36 | default="Credit", 37 | max_length=20, 38 | ), 39 | ), 40 | migrations.AlterField( 41 | model_name="order", 42 | name="discount", 43 | field=models.ForeignKey( 44 | blank=True, 45 | null=True, 46 | on_delete=django.db.models.deletion.SET_NULL, 47 | to="registration.Discount", 48 | ), 49 | ), 50 | migrations.AlterField( 51 | model_name="pricelevel", 52 | name="priceLevelOptions", 53 | field=models.ManyToManyField( 54 | blank=True, to="registration.PriceLevelOption" 55 | ), 56 | ), 57 | ] 58 | -------------------------------------------------------------------------------- /registration/templates/registration/emails/dealer/payment.txt: -------------------------------------------------------------------------------- 1 | {% load mathfilters %} 2 | {% autoescape off %} 3 | Salutations Vendor, 4 | 5 | Thank you for participating in {{event}}'s Dealers Den! 6 | If you have any questions or concerns, please email {{ event.dealerEmail }}. 7 | 8 | Your confirmation number is: {{order.reference}} 9 | 10 | Dealer Invoice for {{dealer.attendee}}, {{dealer.businessName}} 11 | ------------------------------------------------------------------ 12 | Table Type - {{dealer.tableSize}}: ${{dealer.tableSize.basePrice}} 13 | {% if dealer.needWifi %} 14 | Wi-Fi Access: $50.00 15 | {% endif %} 16 | {% if dealer.getUnpaidPartnerCount > 0%} 17 | 18 | Partners x{{dealer.getUnpaidPartnerCount}}: ${{dealer.getUnpaidPartnerCount|mul:55}}.00 19 | {% endif %} 20 | {% if dealer.asstBreakfast%} 21 | Partner Breakfast x{{dealer.getPartnerCount}}: ${{dealer.getPartnerCount|mul:60}}.00 22 | {% endif %} 23 | 24 | Attendee Level - {{orderItem.priceLevel}}: ${{orderItem.priceLevel.basePrice}} 25 | 26 | {% for ao in options %} 27 | {% if ao.option.optionExtraType == 'int' %} 28 | Option: {{ao.option.optionName}} x{{ao.optionValue}}: ${{ao.getTotal}} 29 | {% else %} 30 | Option: {{ao.option.optionName}}: ${{ao.option.optionPrice}} 31 | {% endif %} 32 | {% endfor %} 33 | 34 | {% if dealer.discount > 0 %} 35 | Other Discount {{dealer.discountReason}}: -${{dealer.discount}} 36 | {% endif %} 37 | 38 | {% if order.charityDonation > 0 %} 39 | Charity Donation: ${{order.charityDonation}} 40 | {% endif %} 41 | {% if order.orgDonation > 0 %} 42 | {{event}} Donation: ${{order.orgDonation}} 43 | {% endif %} 44 | 45 | Total: ${{order.total}} 46 | ------------------------------------------------------------------ 47 | 48 | If you have listed any partners, they will receive an email with instructions about how to register. 49 | {% endautoescape %} 50 | --------------------------------------------------------------------------------