From b85c0f655dda43975b7ff589380c3f024c33b052 Mon Sep 17 00:00:00 2001 From: Victoria Earl Date: Wed, 21 Feb 2024 17:12:02 -0500 Subject: [PATCH 1/2] Fix recursion for the extends tag We changed how we load plugin templates, this updates the Stock plugin to accommodate that. --- magstock/templates/guests/band_agreement.html | 2 +- magstock/templates/guests/guest_agreement.html | 2 +- magstock/templates/magstock/addons.html | 2 +- magstock/templates/magstock/campsite_assignments.html | 2 +- magstock/templates/magstock/food_consumers.html | 2 +- magstock/templates/magstock/grouped.html | 2 +- magstock/templates/magstock/parking.html | 2 +- magstock/templates/preregistration/closed.html | 2 +- magstock/templates/registration/check_in_form.html | 2 +- magstock/templates/registration/index.html | 2 +- magstock/templates/registration/new.html | 2 +- magstock/templates/staffing/food_restrictions.html | 2 +- magstock/templates/staffing/volunteer_agreement.html | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/magstock/templates/guests/band_agreement.html b/magstock/templates/guests/band_agreement.html index 129b909..b3027f4 100644 --- a/magstock/templates/guests/band_agreement.html +++ b/magstock/templates/guests/band_agreement.html @@ -1,4 +1,4 @@ -{% extends "guests/band_agreement.html" %} +{% extends "uber/templates/guests/band_agreement.html" %} {% block band_text_merch_inner %} Tables will be available in our concert tent throughout the weekend for performers' use. diff --git a/magstock/templates/guests/guest_agreement.html b/magstock/templates/guests/guest_agreement.html index 0557364..03d56eb 100644 --- a/magstock/templates/guests/guest_agreement.html +++ b/magstock/templates/guests/guest_agreement.html @@ -1,4 +1,4 @@ -{% extends "guests/guest_agreement.html" %} +{% extends "uber/templates/guests/guest_agreement.html" %} {% block guest_text_merch_inner %} Tables will be available in our concert tent throughout the weekend for guests' use. diff --git a/magstock/templates/magstock/addons.html b/magstock/templates/magstock/addons.html index ee889bd..cd50647 100644 --- a/magstock/templates/magstock/addons.html +++ b/magstock/templates/magstock/addons.html @@ -1,4 +1,4 @@ -{% extends "base.html" %}{% set admin_area=True %} +{% extends "uber/templates/base.html" %}{% set admin_area=True %} {% block title %}Parties{% endblock %} {% block content %} diff --git a/magstock/templates/magstock/campsite_assignments.html b/magstock/templates/magstock/campsite_assignments.html index 3b0acb9..7333d24 100644 --- a/magstock/templates/magstock/campsite_assignments.html +++ b/magstock/templates/magstock/campsite_assignments.html @@ -1,4 +1,4 @@ -{% extends "base.html" %}{% set admin_area=True %} +{% extends "uber/templates/base.html" %}{% set admin_area=True %} {% block title %}Magstock Campsites{% endblock %} {% block content %} diff --git a/magstock/templates/magstock/food_consumers.html b/magstock/templates/magstock/food_consumers.html index 3e487c9..1267189 100644 --- a/magstock/templates/magstock/food_consumers.html +++ b/magstock/templates/magstock/food_consumers.html @@ -1,4 +1,4 @@ -{% extends "base.html" %}{% set admin_area=True %} +{% extends "uber/templates/base.html" %}{% set admin_area=True %} {% block title %}Magstock Food Report{% endblock %} {% block content %}

MAGStock Food Report

diff --git a/magstock/templates/magstock/grouped.html b/magstock/templates/magstock/grouped.html index c6bf13d..9e04a7e 100644 --- a/magstock/templates/magstock/grouped.html +++ b/magstock/templates/magstock/grouped.html @@ -1,4 +1,4 @@ -{% extends "base.html" %}{% set admin_area=True %} +{% extends "uber/templates/base.html" %}{% set admin_area=True %} {% block title %}Parties{% endblock %} {% block content %} diff --git a/magstock/templates/magstock/parking.html b/magstock/templates/magstock/parking.html index 171d97e..8948b9f 100644 --- a/magstock/templates/magstock/parking.html +++ b/magstock/templates/magstock/parking.html @@ -1,4 +1,4 @@ -{% extends "base.html" %}{% set admin_area=True %} +{% extends "uber/templates/base.html" %}{% set admin_area=True %} {% block title %}Magstock Vehicles{% endblock %} {% block content %} diff --git a/magstock/templates/preregistration/closed.html b/magstock/templates/preregistration/closed.html index f2ebf1d..90dae04 100644 --- a/magstock/templates/preregistration/closed.html +++ b/magstock/templates/preregistration/closed.html @@ -1,4 +1,4 @@ -{% extends "./preregistration/preregbase.html" %} +{% extends "uber/templates/preregistration/preregbase.html" %} {% block title %}Preregistration is now closed{% endblock %} {% block backlink %}{% endblock %} {% block content %} diff --git a/magstock/templates/registration/check_in_form.html b/magstock/templates/registration/check_in_form.html index c096fe0..667094d 100644 --- a/magstock/templates/registration/check_in_form.html +++ b/magstock/templates/registration/check_in_form.html @@ -1,4 +1,4 @@ -{% extends "registration/check_in_form_base.html" %} +{% extends "uber/templates/registration/check_in_form_base.html" %} {% block checkin_fields %}
diff --git a/magstock/templates/registration/index.html b/magstock/templates/registration/index.html index b8f33ab..e17a196 100644 --- a/magstock/templates/registration/index.html +++ b/magstock/templates/registration/index.html @@ -1,4 +1,4 @@ -{% extends "registration/index_base.html" %} +{% extends "uber/templates/registration/index_base.html" %} {% block tableheadings %} Camping/Cabin Type diff --git a/magstock/templates/registration/new.html b/magstock/templates/registration/new.html index 3e52383..1a71426 100644 --- a/magstock/templates/registration/new.html +++ b/magstock/templates/registration/new.html @@ -1,4 +1,4 @@ -{% extends "registration/new_base.html" %} +{% extends "uber/templates/registration/new_base.html" %} {% block tableheadings %} License Plate diff --git a/magstock/templates/staffing/food_restrictions.html b/magstock/templates/staffing/food_restrictions.html index 891d18d..eaa882c 100644 --- a/magstock/templates/staffing/food_restrictions.html +++ b/magstock/templates/staffing/food_restrictions.html @@ -1,4 +1,4 @@ -{% extends "base.html" %}{% set admin_area=True %} +{% extends "uber/templates/base.html" %}{% set admin_area=True %} {% block title %}Dietary Restrictions{% endblock %} {% block backlink %}{% endblock %} {% block content %} diff --git a/magstock/templates/staffing/volunteer_agreement.html b/magstock/templates/staffing/volunteer_agreement.html index 82355ca..ef55cf2 100644 --- a/magstock/templates/staffing/volunteer_agreement.html +++ b/magstock/templates/staffing/volunteer_agreement.html @@ -1,4 +1,4 @@ -{% extends "base.html" %}{% set admin_area=True %} +{% extends "uber/templates/base.html" %}{% set admin_area=True %} {% block title %}Volunteer Agreement{% endblock %} {% block backlink %}{% endblock %} {% block content %} From cb69ccb38c6851c30066b9c78ee7f46ced9955d1 Mon Sep 17 00:00:00 2001 From: Victoria Earl Date: Wed, 13 Mar 2024 22:39:43 -0400 Subject: [PATCH 2/2] Convert dealer reg to new form system --- magstock/__init__.py | 1 + magstock/config.py | 16 ++ magstock/forms.py | 96 +++++++ magstock/model_checks.py | 25 +- magstock/models.py | 9 +- .../forms/attendee/badge_extras.html | 63 ++++ .../templates/forms/attendee/consents.html | 32 +++ .../templates/forms/attendee/other_info.html | 9 + .../forms/attendee/personal_info.html | 13 + .../forms/attendee/prereg_other_info.html | 34 +++ magstock/templates/regextra.html | 271 +----------------- 11 files changed, 277 insertions(+), 292 deletions(-) create mode 100644 magstock/forms.py create mode 100644 magstock/templates/forms/attendee/badge_extras.html create mode 100644 magstock/templates/forms/attendee/consents.html create mode 100644 magstock/templates/forms/attendee/other_info.html create mode 100644 magstock/templates/forms/attendee/personal_info.html create mode 100644 magstock/templates/forms/attendee/prereg_other_info.html diff --git a/magstock/__init__.py b/magstock/__init__.py index 945be47..61924fd 100644 --- a/magstock/__init__.py +++ b/magstock/__init__.py @@ -11,6 +11,7 @@ from . import models # noqa: F401,E402,F403 from . import model_checks # noqa: F401,E402,F403 from . import receipt_items # noqa: F401 +from . import forms # noqa: F401 mount_site_sections(config['module_root']) static_overrides(join(config['module_root'], 'static')) diff --git a/magstock/config.py b/magstock/config.py index a5eacb2..4e41769 100644 --- a/magstock/config.py +++ b/magstock/config.py @@ -23,6 +23,22 @@ @Config.mixin class ExtraConfig: + @property + def FORMATTED_CAMPING_TYPES(self): + # Returns camping type options for the 'card_select' form macro. + + return [ + {'name': 'Tent', 'icon': '', 'link': '', 'value': c.TENT, 'price': 0, + 'desc': 'Included in your registration! Tent camping is first come, first serve.'}, + {'name': 'Car', 'icon': '', 'link': '', 'value': c.CAR, 'price': c.CAMPING_TYPE_PRICES[c.CAR], + 'desc': 'Price is per vehicle.'}, + {'name': 'RV', 'icon': '', 'link': '', 'value': c.RV, 'price': c.CAMPING_TYPE_PRICES[c.RV], + 'desc': 'Price is per vehicle, and there are no power or sewage hookups.'}, + {'name': 'Cabin ($600+)', 'icon': '', 'link': '', 'value': c.CABIN, + 'price': 0, + 'desc': 'Select a cabin option below. Cabins are limited availability.'} + ] + @property def CAMPING_TYPE_BUTTONS(self): # With apologies to future-me diff --git a/magstock/forms.py b/magstock/forms.py new file mode 100644 index 0000000..c2a12ad --- /dev/null +++ b/magstock/forms.py @@ -0,0 +1,96 @@ +import cherrypy + +from markupsafe import Markup +from wtforms import (BooleanField, DateField, EmailField, Form, FormField, + HiddenField, SelectField, SelectMultipleField, IntegerField, + StringField, TelField, validators, TextAreaField) +from wtforms.validators import ValidationError, StopValidation +from wtforms.widgets import html_params +from pockets.autolog import log + +from uber.config import c +from uber.forms import (AddressForm, NumberInputGroup, MagForm, IntSelect, SwitchInput, HiddenIntField, SelectAvailableField, CustomValidation) +from uber.custom_tags import popup_link, format_currency, pluralize, table_prices, email_to_link + + +@MagForm.form_mixin +class PersonalInfo: + license_plate = StringField('License Plate #', render_kw={'placeholder': 'XXX-XXXX'}) + badge_printed_name = HiddenField('Badge Printed Name (Unused)') + + def get_optional_fields(self, attendee, is_admin=False): + optional_list = self.super_get_optional_fields(attendee, is_admin) + + # This field is disabled/hidden, so it's never required + optional_list.append('badge_printed_name') + return optional_list + + def onsite_contact_label(self): + return "MAGBuddy" + + def license_plate_desc(self): + return ("Get through registration faster on-site! If you don't know which vehicle you'll be using, " + "you can come back and update this later.") + + +@MagForm.form_mixin +class BadgeExtras: + camping_type = HiddenIntField('How are you camping?') + cabin_type = SelectAvailableField('Cabin Type', + choices=[(0, 'Please select a cabin type')] + c.CABIN_TYPE_OPTS, + default=0, coerce=int, + sold_out_list_func=lambda: [cabin for cabin in c.CABIN_AVAILABILITY_MATRIX + if c.CABIN_AVAILABILITY_MATRIX[cabin] < 1]) + # Meal tickets go here + + def camping_type_desc(self): + return Markup( + 'Car and RV camping is restricted to a field adjacent to the communal bathrooms. ' + 'Please review the information about camping options, including cabin type descriptions, ' + 'on our website.') + + +@MagForm.form_mixin +class Consents: + acknowledged_checkin_policy = BooleanField( + Markup('I acknowledge that there is NO early check-in and if I show up on Wednesday night ' + 'then I will probably be asked to leave the campground.'), + validators=[validators.InputRequired("You must acknowledge that early check-in is not possible.")]) + waiver_signature = StringField( + 'Electronic Signature', + validators=[validators.DataRequired("You must sign your full legal name to consent to the waiver.")]) + waiver_date_display = DateField('Date of Signature', render_kw={'disabled': True}) + waiver_date = HiddenField('Date of Signature (UTC)', + validators=[validators.DataRequired("No date of signature." + "Please refresh the page or contact us.")]) + waiver_consent = BooleanField( + Markup('Yes, I understand that checking this box constitutes a legal signature ' + 'confirming that I acknowledge and agree to the above waiver.'), + validators=[validators.InputRequired("You must check the waiver consent checkbox.")]) + + def get_non_admin_locked_fields(self, attendee): + if attendee.needs_pii_consent: + return [] + + return ['pii_consent', 'acknowledged_checkin_policy', 'waiver_date', 'waiver_signature', 'waiver_consent'] + + def get_optional_fields(self, attendee, is_admin=False): + optional_fields = self.super_get_optional_fields(attendee, is_admin) + + if (attendee.is_new or attendee.badge_status == c.PENDING_STATUS) or ( + attendee.valid_placeholder and cherrypy.request.method == 'POST'): + optional_fields.extend(['acknowledged_checkin_policy', 'waiver_date', + 'waiver_signature', 'waiver_consent']) + + return optional_fields + + +@MagForm.form_mixin +class PreregOtherInfo: + first_name = HiddenField('First Name') + last_name = HiddenField('Last Name') + acknowledged_checkin_policy = Consents.acknowledged_checkin_policy + waiver_signature = Consents.waiver_signature + waiver_date_display = Consents.waiver_date_display + waiver_date = Consents.waiver_date + waiver_consent = Consents.waiver_consent \ No newline at end of file diff --git a/magstock/model_checks.py b/magstock/model_checks.py index e81ed5f..1b006b3 100644 --- a/magstock/model_checks.py +++ b/magstock/model_checks.py @@ -13,36 +13,15 @@ from uber.jinja import template_overrides from uber.utils import add_opt, mount_site_sections, static_overrides -@validation.Attendee -def camping_checks(attendee): - if not attendee.placeholder and not attendee.camping_type: - return 'Please tell us how you are camping' - @prereg_validation.Attendee def waiver_consent(attendee): if attendee.is_new or attendee.placeholder: - if not attendee.waiver_signature: - return 'You must sign your full legal name to consent to the waiver' - elif attendee.waiver_signature != attendee.legal_first_name + ' ' + attendee.legal_last_name: + if attendee.waiver_signature and attendee.waiver_signature != attendee.legal_first_name + ' ' + attendee.legal_last_name: return 'Your waiver signature must match your full legal name, {}'.format( attendee.legal_first_name + ' ' + attendee.legal_last_name) - elif not attendee.waiver_consent: - return 'You must check the waiver consent checkbox' - elif attendee.waiver_date != datetime.utcnow().date(): + elif attendee.waiver_date and attendee.waiver_date != datetime.utcnow().date(): return 'Your date of signature should be today' - - -@prereg_validation.Attendee -def no_early_checkin(attendee): - if (attendee.is_new or attendee.placeholder) and not attendee.acknowledged_checkin_policy: - return 'You must acknowledge that early check-in is not possible.' - - -@validation.Attendee -def must_pick_cabin(attendee): - if attendee.camping_type == c.CABIN and not attendee.cabin_type: - return 'Please select a cabin type.' @prereg_validation.Attendee diff --git a/magstock/models.py b/magstock/models.py index 47ed46a..0fad2df 100644 --- a/magstock/models.py +++ b/magstock/models.py @@ -34,7 +34,7 @@ def calc_meal_ticket_change(self, **kwargs): new_cost = int(kwargs['dinner_tickets']) * c.FOOD_PRICE * 100 return current_cost, new_cost - current_cost - + def calc_camping_type_change(self, **kwargs): if 'camping_type' in kwargs: if kwargs['camping_type'] == c.CABIN: @@ -54,7 +54,12 @@ def calc_camping_type_change(self, **kwargs): new_cost = 0 return int(current_cost) * 100, (int(new_cost) * 100) - (int(current_cost) * 100) - + + def auto_update_receipt(self, params): + if params.get('camping_type') and params['camping_type'] != c.CABIN: + params['cabin_type'] = 0 + return params + @presave_adjustment def no_cabin_if_not_cabin_camping(self): if self.camping_type != c.CABIN: diff --git a/magstock/templates/forms/attendee/badge_extras.html b/magstock/templates/forms/attendee/badge_extras.html new file mode 100644 index 0000000..e63d480 --- /dev/null +++ b/magstock/templates/forms/attendee/badge_extras.html @@ -0,0 +1,63 @@ +{% extends 'uber/templates/forms/attendee/badge_extras.html' %} + +{% set id_upgrade_prepend = "upgrade_" if upgrade_modal else "" %} + +{% block badge_type %} +{{ super() }} +{{ badge_extras.camping_type(id=id_upgrade_prepend ~ "camping_type") }} + +{% if not receipt or upgrade_modal %} +
+ {{ form_macros.card_select(badge_extras.camping_type, + c.FORMATTED_CAMPING_TYPES, disabled_opts=[], + target_field_id=id_upgrade_prepend ~ "camping_type") }} +
+ {{ form_macros.toggle_fields_js(badge_extras.camping_type, [badge_extras.cabin_type], on_values=["267506057"], toggle_required=True, + closest_hide_selector='.row', + source_field_id=id_upgrade_prepend ~ "camping_type", + target_field_prepend=id_upgrade_prepend) }} +{% elif not is_prereg_attendee %} +
+
+
{{ badge_extras.camping_type.label.text }}
+
{{ attendee.camping_type_label }}{% if attendee.camping_type != c.CABIN %}{{ macros.upgrade_button('camping-type') }}{% endif %}
+
+
+{% endif %} + +{% if not receipt or upgrade_modal %} +
+
{{ form_macros.form_input(badge_extras.cabin_type, required=True, id=id_upgrade_prepend ~ "cabin_type") }}
+
+{% endif %} +{% endblock %} + +{% block upgrade_modal_js %} +{{ super() }} + +{% if upgrade_modal %} + +{% endif %} +{% endblock %} \ No newline at end of file diff --git a/magstock/templates/forms/attendee/consents.html b/magstock/templates/forms/attendee/consents.html new file mode 100644 index 0000000..1e00812 --- /dev/null +++ b/magstock/templates/forms/attendee/consents.html @@ -0,0 +1,32 @@ +{% extends 'uber/templates/forms/attendee/consents.html' %} + +{% block required %} +{{ super() }} + +{% if not attendee.is_new and attendee.badge_status != c.PENDING_STATUS %} +
+
{{ form_macros.form_input(consents.acknowledged_checkin_policy) }}
+
+ +
+
+

+ We require all attendees to sign a waiver before registering. Please + {{ macros.popup_link("../static_views/waiver.html", "view the waiver here") }}, then sign below. +

+
+
+ +
+
{{ form_macros.form_input(consents.waiver_signature) }}
+
+ {{ form_macros.form_input(consents.waiver_date_display, value=now()|datetime_local("%Y-%m-%d")) }} + {{ form_macros.form_input(consents.waiver_date, value=now()|datetime("%Y-%m-%d")) }} +
+
+ +
+
{{ form_macros.form_input(consents.waiver_consent) }}
+
+{% endif %} +{% endblock %} \ No newline at end of file diff --git a/magstock/templates/forms/attendee/other_info.html b/magstock/templates/forms/attendee/other_info.html new file mode 100644 index 0000000..e57a1fb --- /dev/null +++ b/magstock/templates/forms/attendee/other_info.html @@ -0,0 +1,9 @@ +{% extends 'uber/templates/forms/attendee/other_info.html' %} + +{% block accessibility %} +{% if not admin_area %} +
+
For accessibility-related needs or questions, please contact {{ "accessibility@magstock.org"|email_to_link }}.
+
+{% endif %} +{% endblock %} \ No newline at end of file diff --git a/magstock/templates/forms/attendee/personal_info.html b/magstock/templates/forms/attendee/personal_info.html new file mode 100644 index 0000000..e634145 --- /dev/null +++ b/magstock/templates/forms/attendee/personal_info.html @@ -0,0 +1,13 @@ +{% extends 'uber/templates/forms/attendee/personal_info.html' %} + +{% block address %} +{% if attendee.badge_type == c.PSEUDO_DEALER_BADGE %} +{# Hack to get around WTForms requiring a selection for choice fields #} + +{% endif %} + +
+ {{ super() }} +
{{ form_macros.form_input(personal_info.license_plate) }}
+
+{% endblock %} \ No newline at end of file diff --git a/magstock/templates/forms/attendee/prereg_other_info.html b/magstock/templates/forms/attendee/prereg_other_info.html new file mode 100644 index 0000000..29db360 --- /dev/null +++ b/magstock/templates/forms/attendee/prereg_other_info.html @@ -0,0 +1,34 @@ +{% extends 'uber/templates/forms/attendee/prereg_other_info.html' %} + +{% block prereg_extras %} +{{ super() }} + +
+
{{ form_macros.form_input(other_info.acknowledged_checkin_policy) }}
+
+ +
+
+

+ We require all attendees to sign a waiver before registering. Please + {{ macros.popup_link("../static_views/waiver.html", "view the waiver here") }}, then sign below. +

+
+
+ +{# The waiver validation needs to check first/last name, so they need to exist on this form. #} +{{ other_info.first_name }} +{{ other_info.last_name }} + +
+
{{ form_macros.form_input(other_info.waiver_signature) }}
+
+ {{ form_macros.form_input(other_info.waiver_date_display, value=now()|datetime_local("%Y-%m-%d")) }} + {{ form_macros.form_input(other_info.waiver_date, value=now()|datetime("%Y-%m-%d")) }} +
+
+ +
+
{{ form_macros.form_input(other_info.waiver_consent) }}
+
+{% endblock %} \ No newline at end of file diff --git a/magstock/templates/regextra.html b/magstock/templates/regextra.html index 38e94fe..968ff2c 100644 --- a/magstock/templates/regextra.html +++ b/magstock/templates/regextra.html @@ -1,78 +1,14 @@ {% import 'macros.html' as macros with context %} -{% if c.PAGE_PATH != '/preregistration/transfer_badge' %} -
-
- -
-
- Brunch -
-
-
-
- Dinner -
-
-
Ramblewood's kitchen will serve 6 meals: Thursday dinner, Friday & Saturday brunch & dinner, and Sunday brunch. Please choose the number of meal tickets you would like to buy.
-
- -
- -
- {{ macros.checkgroup(attendee, 'meal_restrictions') }} -
-
Ramblewood's kitchen labels allergens at meals but can only specifically accommodate the above restrictions.
-
-
- -
-
- - {% if admin_area %} -
- -
- {% else %} -
-
- {% for key, dict in c.CAMPING_TYPE_BUTTONS.items() %} - {% if not money_fields_ro or - (c.CAMPING_TYPE_PRICES[attendee.camping_type]|int <= dict[1]|int and attendee.camping_type != c.CABIN) or - key == c.CABIN %} - - {% endif %} - {% endfor %} -
- {% if not admin_area %} -

- Car and RV camping is restricted to a field adjacent to the communal bathrooms. - Please review the information about camping options, including cabin type descriptions, on our website. -

- {% endif %} -
- {% endif %} -
- -
- -
- - {% if not admin_area %} -

- We will reach out closer to the event to discuss assignment preferences. -

- {% endif %} -
-
-
-{% endif %} -
- {% if money_fields_ro %} -
- -
- You have {{ attendee.brunch_tickets }} brunch ticket(s) and {{ attendee.dinner_tickets }} dinner ticket(s). - {{ macros.upgrade_button('meal-tickets', "Add") }} -
- {% if not admin_area %} -
Ramblewood's kitchen will serve 6 meals: Thursday dinner, Friday & Saturday brunch & dinner, and Sunday brunch. Please choose the number of meal tickets you would like to buy.
- {% endif %} -
- -
- -
- {{ macros.checkgroup(attendee, 'meal_restrictions') }} -
-
Ramblewood's kitchen labels allergens at meals but can only specifically accommodate the above restrictions.
-
- -
- -
- {% if attendee.camping_type != c.CABIN %}{{ attendee.camping_type_label }}{% else %}{{ attendee.cabin_type_label }}{% endif %} {{ macros.upgrade_button('camping-type') }} -

- Car and RV camping is restricted to a field adjacent to the communal bathrooms. - Please review the information about camping options, including cabin type descriptions, on our website. -

-
-
- {% endif %} -
- -
- - {% if not admin_area %} -

- Get through registration faster on-site! If you don't know which vehicle you'll be using, you can come back and update this later. -

- {% endif %} -
-
-
- {% if c.AT_THE_CON and is_prereg_form %} {% endif %} - -{% if not admin_area %} -
-
For accessibility-related needs or questions, please contact {{ "accessibility@magstock.org"|email_to_link }}.
-
-{% endif %} - -{% if is_prereg_form or c.PAGE_PATH == '/preregistration/transfer_badge' or (attendee.placeholder or attendee.is_new) and not admin_area %} -
-
-
- -
-
-
- - -{% endif %}