django_program.programs.forms

Forms for the programs app.

Classes

PaymentInfoForm

Form for submitting payment details for reimbursement.

ReceiptForm

Form for uploading an expense receipt.

TravelGrantApplicationForm

Public-facing form for applying for a travel grant.

TravelGrantMessageForm

Form for applicants to send a message on their grant.

class django_program.programs.forms.TravelGrantApplicationForm[source]

Bases: ModelForm

Public-facing form for applying for a travel grant.

Mirrors PyCon US’s travel grant application flow. Collects request type, travel plan breakdowns (airfare + lodging), applicant profile, and community involvement. The conference and user fields are set by the view, not the form.

Parameters:
class Meta[source]

Bases: object

model

alias of TravelGrant

fields = ['request_type', 'application_type', 'travel_from', 'international', 'first_time', 'days_attending', 'travel_plans_airfare_description', 'travel_plans_airfare_amount', 'travel_plans_lodging_description', 'travel_plans_lodging_amount', 'requested_amount', 'sharing_expenses', 'traveling_with', 'experience_level', 'occupation', 'involvement', 'reason']
widgets = {'application_type': <class 'django.forms.widgets.Select'>, 'experience_level': <class 'django.forms.widgets.Select'>, 'first_time': <django.forms.widgets.Select object>, 'international': <class 'django.forms.widgets.CheckboxInput'>, 'involvement': <django.forms.widgets.Textarea object>, 'occupation': <django.forms.widgets.Textarea object>, 'reason': <django.forms.widgets.Textarea object>, 'request_type': <class 'django.forms.widgets.RadioSelect'>, 'requested_amount': <django.forms.widgets.NumberInput object>, 'sharing_expenses': <class 'django.forms.widgets.CheckboxInput'>, 'travel_plans_airfare_amount': <django.forms.widgets.NumberInput object>, 'travel_plans_airfare_description': <django.forms.widgets.TextInput object>, 'travel_plans_lodging_amount': <django.forms.widgets.NumberInput object>, 'travel_plans_lodging_description': <django.forms.widgets.TextInput object>, 'traveling_with': <django.forms.widgets.Textarea object>}
labels = {'application_type': 'Application type', 'days_attending': 'Which days do you plan to attend?', 'experience_level': 'Python experience level', 'first_time': 'First time attending this conference?', 'international': 'International travel', 'involvement': 'Community involvement', 'occupation': 'Current occupation or situation', 'reason': 'Why do you need a travel grant?', 'request_type': 'What are you requesting?', 'requested_amount': 'Total amount requested (USD)', 'sharing_expenses': 'Sharing travel expenses with another applicant?', 'travel_from': 'Traveling from', 'travel_plans_airfare_amount': 'Airfare amount (USD)', 'travel_plans_airfare_description': 'Airfare details', 'travel_plans_lodging_amount': 'Lodging amount (USD)', 'travel_plans_lodging_description': 'Lodging details', 'traveling_with': 'Who are you traveling with?'}
__init__(*args, conference=None, **kwargs)[source]

Set required fields, placeholders, and dynamic day choices.

Parameters:
clean_days_attending()[source]

Serialize checkbox selections to comma-separated string for storage.

Return type:

str

clean_requested_amount()[source]

Validate that the requested amount is positive.

Return type:

Decimal

clean()[source]

Cross-field validation matching PyCon’s patterns.

Return type:

dict[str, object]

base_fields = {'application_type': <django.forms.fields.TypedChoiceField object>, 'days_attending': <django.forms.fields.MultipleChoiceField object>, 'experience_level': <django.forms.fields.TypedChoiceField object>, 'first_time': <django.forms.fields.NullBooleanField object>, 'international': <django.forms.fields.BooleanField object>, 'involvement': <django.forms.fields.CharField object>, 'occupation': <django.forms.fields.CharField object>, 'reason': <django.forms.fields.CharField object>, 'request_type': <django.forms.fields.TypedChoiceField object>, 'requested_amount': <django.forms.fields.DecimalField object>, 'sharing_expenses': <django.forms.fields.BooleanField object>, 'travel_from': <django.forms.fields.CharField object>, 'travel_plans_airfare_amount': <django.forms.fields.DecimalField object>, 'travel_plans_airfare_description': <django.forms.fields.CharField object>, 'travel_plans_lodging_amount': <django.forms.fields.DecimalField object>, 'travel_plans_lodging_description': <django.forms.fields.CharField object>, 'traveling_with': <django.forms.fields.CharField object>}
declared_fields = {'days_attending': <django.forms.fields.MultipleChoiceField object>}
property media

Return all media required to render the widgets on this form.

class django_program.programs.forms.TravelGrantMessageForm[source]

Bases: ModelForm

Form for applicants to send a message on their grant.

class Meta[source]

Bases: object

model

alias of TravelGrantMessage

fields = ['message']
widgets = {'message': <django.forms.widgets.Textarea object>}
base_fields = {'message': <django.forms.fields.CharField object>}
declared_fields = {}
property media

Return all media required to render the widgets on this form.

class django_program.programs.forms.ReceiptForm[source]

Bases: ModelForm

Form for uploading an expense receipt.

class Meta[source]

Bases: object

model

alias of Receipt

fields = ['receipt_type', 'date', 'amount', 'description', 'receipt_file']
widgets = {'amount': <django.forms.widgets.NumberInput object>, 'date': <django.forms.widgets.DateInput object>, 'description': <django.forms.widgets.TextInput object>}
clean_receipt_file()[source]

Enforce a 10 MB file size limit.

Return type:

object

base_fields = {'amount': <django.forms.fields.DecimalField object>, 'date': <django.forms.fields.DateField object>, 'description': <django.forms.fields.CharField object>, 'receipt_file': <django.forms.fields.FileField object>, 'receipt_type': <django.forms.fields.TypedChoiceField object>}
declared_fields = {}
property media

Return all media required to render the widgets on this form.

class django_program.programs.forms.PaymentInfoForm[source]

Bases: ModelForm

Form for submitting payment details for reimbursement.

class Meta[source]

Bases: object

model

alias of PaymentInfo

fields = ['payment_method', 'legal_name', 'address_street', 'address_city', 'address_state', 'address_zip', 'address_country', 'paypal_email', 'zelle_email', 'wise_email', 'bank_name', 'bank_account_number', 'bank_routing_number', 'bank_holder_name', 'bank_holder_address', 'bank_address', 'bank_additional']
widgets = {'bank_additional': <django.forms.widgets.Textarea object>, 'bank_address': <django.forms.widgets.Textarea object>, 'bank_holder_address': <django.forms.widgets.Textarea object>}
clean()[source]

Validate that method-specific fields are provided.

Return type:

dict[str, object]

base_fields = {'address_city': <django.forms.fields.CharField object>, 'address_country': <django.forms.fields.CharField object>, 'address_state': <django.forms.fields.CharField object>, 'address_street': <django.forms.fields.CharField object>, 'address_zip': <django.forms.fields.CharField object>, 'bank_account_number': <django.forms.fields.CharField object>, 'bank_additional': <django.forms.fields.CharField object>, 'bank_address': <django.forms.fields.CharField object>, 'bank_holder_address': <django.forms.fields.CharField object>, 'bank_holder_name': <django.forms.fields.CharField object>, 'bank_name': <django.forms.fields.CharField object>, 'bank_routing_number': <django.forms.fields.CharField object>, 'legal_name': <django.forms.fields.CharField object>, 'payment_method': <django.forms.fields.TypedChoiceField object>, 'paypal_email': <django.forms.fields.CharField object>, 'wise_email': <django.forms.fields.CharField object>, 'zelle_email': <django.forms.fields.CharField object>}
declared_fields = {}
property media

Return all media required to render the widgets on this form.