commit
8a4039b0ec
6 changed files with 247 additions and 17 deletions
|
@ -1,9 +1,34 @@
|
||||||
from django import forms
|
from django import forms
|
||||||
|
from symposion.proposals.forms import ProposalMixIn
|
||||||
|
|
||||||
from .models import TalkProposal
|
from .models import ConferenceSpeaker, TalkProposal
|
||||||
|
|
||||||
|
|
||||||
class ProposalForm(forms.ModelForm):
|
class ConferenceSpeakerForm(forms.ModelForm):
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
model = ConferenceSpeaker
|
||||||
|
exclude = [
|
||||||
|
'user',
|
||||||
|
'biography_html',
|
||||||
|
'experience_html',
|
||||||
|
'invite_email',
|
||||||
|
'invite_token',
|
||||||
|
'annotation',
|
||||||
|
]
|
||||||
|
|
||||||
|
def __init__(self, *a, **k):
|
||||||
|
super(ConferenceSpeakerForm, self).__init__(*a, **k)
|
||||||
|
self.fields['code_of_conduct'].required = True
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class ProposalForm(forms.ModelForm, ProposalMixIn):
|
||||||
|
|
||||||
|
def __init__(self, *a, **k):
|
||||||
|
super(ProposalForm, self).__init__(*a, **k)
|
||||||
|
self.description_required()
|
||||||
|
self.abstract_required()
|
||||||
|
|
||||||
def clean_description(self):
|
def clean_description(self):
|
||||||
value = self.cleaned_data["description"]
|
value = self.cleaned_data["description"]
|
||||||
|
@ -20,9 +45,12 @@ class TalkProposalForm(ProposalForm):
|
||||||
model = TalkProposal
|
model = TalkProposal
|
||||||
fields = [
|
fields = [
|
||||||
"title",
|
"title",
|
||||||
"audience_level",
|
|
||||||
"description",
|
"description",
|
||||||
"abstract",
|
"abstract",
|
||||||
|
"new_presentation",
|
||||||
|
"extended_presentation",
|
||||||
"additional_notes",
|
"additional_notes",
|
||||||
|
"extra_av",
|
||||||
|
"slides_release",
|
||||||
"recording_release",
|
"recording_release",
|
||||||
]
|
]
|
||||||
|
|
33
pinaxcon/proposals/migrations/0002_conferencespeaker.py
Normal file
33
pinaxcon/proposals/migrations/0002_conferencespeaker.py
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.11.4 on 2017-08-13 18:45
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('symposion_speakers', '0007_auto_20170810_1651'),
|
||||||
|
('proposals', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ConferenceSpeaker',
|
||||||
|
fields=[
|
||||||
|
('speakerbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_speakers.SpeakerBase')),
|
||||||
|
('twitter_username', models.CharField(blank=True, help_text='Your Twitter account', max_length=15)),
|
||||||
|
('first_time', models.BooleanField(help_text='')),
|
||||||
|
('experience', models.TextField(blank=True, help_text="List any past speaking experience you have. Edit using <a href='http://warpedvisions.org/projects/markdown-cheat-sheet/target='_blank'>Markdown</a>.", verbose_name='Past speaking experience')),
|
||||||
|
('experience_html', models.TextField(blank=True)),
|
||||||
|
('travel_assistance', models.BooleanField(help_text='Check this field if you require travel assistance to get to North Bay Python in Petaluma, California.')),
|
||||||
|
('lodging_assistance', models.BooleanField(help_text='Check this field if you require lodging assistance in Petaluma, California during North Bay Python.')),
|
||||||
|
('home_city', models.CharField(blank=True, help_text='Which city (and state, and country) will you be traveling from to get to North Bay Python?', max_length=127)),
|
||||||
|
('minority_group', models.CharField(blank=True, help_text='If you are a member of one or more groups that are underrepresented in the tech industry, you may list these here. Your response is optional.', max_length=256, verbose_name='Diversity statement')),
|
||||||
|
('code_of_conduct', models.BooleanField(help_text="I have read and, in the event that my proposal is accepted, agree that I will comply with the <a href='/code-of-conduct'>Code of Conduct</a>.")),
|
||||||
|
],
|
||||||
|
bases=('symposion_speakers.speakerbase',),
|
||||||
|
),
|
||||||
|
]
|
69
pinaxcon/proposals/migrations/0003_auto_20170813_1945.py
Normal file
69
pinaxcon/proposals/migrations/0003_auto_20170813_1945.py
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.11.4 on 2017-08-13 19:45
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('proposals', '0002_conferencespeaker'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='talkproposal',
|
||||||
|
name='audience_level',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='talkproposal',
|
||||||
|
name='extended_presentation',
|
||||||
|
field=models.BooleanField(default=False, help_text='Most talks at North Bay Python go for 30 minutes. We have some openings for 45-minute talks. If you check this field, please explain in your additional notes how you would use the extra 15 minutes.', verbose_name='Optionally consider this proposal for a 45-minute slot'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='talkproposal',
|
||||||
|
name='extra_av',
|
||||||
|
field=models.TextField(blank=True, help_text='We will provide you with a projector with HDMI connection, an audio connection, and one microphone per speaker. If you need anything more than this to present this talk, please list them here.', verbose_name='Extra tech and A/V requirements'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='talkproposal',
|
||||||
|
name='new_presentation',
|
||||||
|
field=models.BooleanField(default=False, help_text='Check this box if North Bay Python will be the first time this talk is presented at a technical conference.', verbose_name='This is a new presentation'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='talkproposal',
|
||||||
|
name='slides_release',
|
||||||
|
field=models.BooleanField(default=True, help_text='I authorize North Bay Python to release a copy of my slides and related materials under the Creative Commons Attribution-ShareAlike 3.0 United States licence, and certify that I have the authority to do so.'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='conferencespeaker',
|
||||||
|
name='experience',
|
||||||
|
field=models.TextField(blank=True, help_text="List any past speaking experience you have. This can include user groups, meetups, or presentations at work or school. Edit using <a href='http://warpedvisions.org/projects/markdown-cheat-sheet/target='_blank'>Markdown</a>.", verbose_name='Past speaking experience'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='conferencespeaker',
|
||||||
|
name='first_time',
|
||||||
|
field=models.BooleanField(help_text='Check this field if this is your first time speaking at a technical conference.', verbose_name='First-time speaker?'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='conferencespeaker',
|
||||||
|
name='lodging_assistance',
|
||||||
|
field=models.BooleanField(help_text='Check this field if you require lodging assistance in Petaluma, California during North Bay Python.', verbose_name='Lodging assistance required?'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='conferencespeaker',
|
||||||
|
name='minority_group',
|
||||||
|
field=models.CharField(blank=True, help_text='If you are a member of one or more groups that are under-represented in the tech industry, you may list these here. Your response is optional.', max_length=256, verbose_name='Diversity statement'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='conferencespeaker',
|
||||||
|
name='travel_assistance',
|
||||||
|
field=models.BooleanField(help_text='Check this field if you require travel assistance to get to North Bay Python in Petaluma, California.', verbose_name='Travel assistance required?'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='talkproposal',
|
||||||
|
name='recording_release',
|
||||||
|
field=models.BooleanField(default=True, help_text='I authorize North Bay Python to release a recording of my talk under the Creative Commons Attribution-ShareAlike 3.0 United States licence.'),
|
||||||
|
),
|
||||||
|
]
|
|
@ -1,25 +1,121 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
from symposion.markdown_parser import parse
|
||||||
from symposion.proposals.models import ProposalBase
|
from symposion.proposals.models import ProposalBase
|
||||||
|
from symposion.speakers.models import SpeakerBase
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class ConferenceSpeaker(SpeakerBase):
|
||||||
|
|
||||||
|
def clean_twitter_username(self):
|
||||||
|
value = self.twitter_username
|
||||||
|
if value.startswith("@"):
|
||||||
|
value = value[1:]
|
||||||
|
return value
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
self.experience_html = parse(self.experience)
|
||||||
|
self.twitter_username = self.clean_twitter_username()
|
||||||
|
return super(ConferenceSpeaker, self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
twitter_username = models.CharField(
|
||||||
|
max_length=15,
|
||||||
|
blank=True,
|
||||||
|
help_text=_(u"Your Twitter account")
|
||||||
|
)
|
||||||
|
|
||||||
|
first_time = models.BooleanField(
|
||||||
|
blank=True,
|
||||||
|
verbose_name=_("First-time speaker?"),
|
||||||
|
help_text=_("Check this field if this is your first time speaking "
|
||||||
|
"at a technical conference."),
|
||||||
|
)
|
||||||
|
|
||||||
|
experience = models.TextField(blank=True, help_text=_
|
||||||
|
("List any past speaking experience you have. This can include "
|
||||||
|
"user groups, meetups, or presentations at work or school. Edit "
|
||||||
|
"using <a href='http://warpedvisions.org/projects/"
|
||||||
|
"markdown-cheat-sheet/target='_blank'>"
|
||||||
|
"Markdown</a>."),
|
||||||
|
verbose_name=_("Past speaking experience"),
|
||||||
|
)
|
||||||
|
experience_html = models.TextField(blank=True)
|
||||||
|
|
||||||
|
travel_assistance = models.BooleanField(
|
||||||
|
blank=True,
|
||||||
|
verbose_name=_("Travel assistance required?"),
|
||||||
|
help_text=_("Check this field if you require travel assistance to get "
|
||||||
|
"to North Bay Python in Petaluma, California."),
|
||||||
|
)
|
||||||
|
|
||||||
|
lodging_assistance = models.BooleanField(
|
||||||
|
blank=True,
|
||||||
|
verbose_name=_("Lodging assistance required?"),
|
||||||
|
help_text=_("Check this field if you require lodging assistance in "
|
||||||
|
"Petaluma, California during North Bay Python."),
|
||||||
|
)
|
||||||
|
|
||||||
|
home_city = models.CharField(
|
||||||
|
blank=True,
|
||||||
|
max_length=127,
|
||||||
|
help_text=_("Which city (and state, and country) will you be "
|
||||||
|
"traveling from to get to North Bay Python?"),
|
||||||
|
)
|
||||||
|
|
||||||
|
minority_group = models.CharField(blank=True, max_length=256,
|
||||||
|
verbose_name=_("Diversity statement"),
|
||||||
|
help_text=_("If you are a member of one or more groups that are "
|
||||||
|
"under-represented in the tech industry, you may list "
|
||||||
|
"these here. Your response is optional."),
|
||||||
|
)
|
||||||
|
|
||||||
|
code_of_conduct = models.BooleanField(
|
||||||
|
help_text=_("I have read and, in the event that my proposal is "
|
||||||
|
"accepted, agree that I will comply with the "
|
||||||
|
"<a href='/code-of-conduct'>Code of Conduct</a>."),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class Proposal(ProposalBase):
|
class Proposal(ProposalBase):
|
||||||
|
|
||||||
AUDIENCE_LEVEL_NOVICE = 1
|
extended_presentation = models.BooleanField(
|
||||||
AUDIENCE_LEVEL_EXPERIENCED = 2
|
default=False,
|
||||||
AUDIENCE_LEVEL_INTERMEDIATE = 3
|
verbose_name=_("Optionally consider this proposal for a 45-minute "
|
||||||
|
"slot"),
|
||||||
AUDIENCE_LEVELS = [
|
help_text=_("Most talks at North Bay Python go for 30 minutes. We "
|
||||||
(AUDIENCE_LEVEL_NOVICE, "Novice"),
|
"have some openings for 45-minute talks. If you check this "
|
||||||
(AUDIENCE_LEVEL_INTERMEDIATE, "Intermediate"),
|
"field, please explain in your additional notes how you "
|
||||||
(AUDIENCE_LEVEL_EXPERIENCED, "Experienced"),
|
"would use the extra 15 minutes."),
|
||||||
]
|
)
|
||||||
|
extra_av = models.TextField(
|
||||||
audience_level = models.IntegerField(choices=AUDIENCE_LEVELS)
|
blank=True,
|
||||||
|
verbose_name=_("Extra tech and A/V requirements"),
|
||||||
|
help_text=_("We will provide you with a projector with HDMI "
|
||||||
|
"connection, an audio connection, and one microphone per "
|
||||||
|
"speaker. If you need anything more than this to present "
|
||||||
|
"this talk, please list them here."),
|
||||||
|
)
|
||||||
|
new_presentation = models.BooleanField(
|
||||||
|
default=False,
|
||||||
|
verbose_name=_("This is a new presentation"),
|
||||||
|
help_text=_("Check this box if North Bay Python will be the first "
|
||||||
|
"time this talk is presented at a technical conference."),
|
||||||
|
)
|
||||||
|
slides_release = models.BooleanField(
|
||||||
|
default=True,
|
||||||
|
help_text=_("I authorize North Bay Python to release a copy of my "
|
||||||
|
"slides and related materials under the Creative Commons "
|
||||||
|
"Attribution-ShareAlike 3.0 United States licence, and "
|
||||||
|
"certify that I have the authority to do so."),
|
||||||
|
)
|
||||||
recording_release = models.BooleanField(
|
recording_release = models.BooleanField(
|
||||||
default=True,
|
default=True,
|
||||||
help_text="By submitting your proposal, you agree to give permission to the conference organizers to record, edit, and release audio and/or video of your presentation. If you do not agree to this, please uncheck this box."
|
help_text=_("I authorize North Bay Python to release a recording of "
|
||||||
|
"my talk under the Creative Commons "
|
||||||
|
"Attribution-ShareAlike 3.0 United States licence."),
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
|
|
|
@ -256,6 +256,9 @@ PINAX_STRIPE_PUBLIC_KEY = os.environ.get("STRIPE_PUBLIC_KEY", "your test public
|
||||||
PINAX_STRIPE_SECRET_KEY = os.environ.get("STRIPE_SECRET_KEY", "your test secret key")
|
PINAX_STRIPE_SECRET_KEY = os.environ.get("STRIPE_SECRET_KEY", "your test secret key")
|
||||||
PINAX_STRIPE_SEND_EMAIL_RECEIPTS = False
|
PINAX_STRIPE_SEND_EMAIL_RECEIPTS = False
|
||||||
|
|
||||||
|
SYMPOSION_SPEAKER_MODEL = "pinaxcon.proposals.models.ConferenceSpeaker"
|
||||||
|
SYMPOSION_SPEAKER_FORM = "pinaxcon.proposals.forms.ConferenceSpeakerForm"
|
||||||
|
|
||||||
# Registrasion Attendee profile model
|
# Registrasion Attendee profile model
|
||||||
ATTENDEE_PROFILE_MODEL = "pinaxcon.registrasion.models.AttendeeProfile"
|
ATTENDEE_PROFILE_MODEL = "pinaxcon.registrasion.models.AttendeeProfile"
|
||||||
# Registrasion attendee profile form -- must act on ATTENDEE_PROFILE_FORM
|
# Registrasion attendee profile form -- must act on ATTENDEE_PROFILE_FORM
|
||||||
|
|
|
@ -13,6 +13,7 @@ django-sitetree==1.8.0
|
||||||
django-countries==4.6.1
|
django-countries==4.6.1
|
||||||
easy-thumbnails==2.4.1
|
easy-thumbnails==2.4.1
|
||||||
django-timezone-field==2.0
|
django-timezone-field==2.0
|
||||||
|
django-mode-utils==3.0.0
|
||||||
|
|
||||||
|
|
||||||
# For testing
|
# For testing
|
||||||
|
@ -21,6 +22,6 @@ coverage==4.0.3
|
||||||
|
|
||||||
# Registrasion
|
# Registrasion
|
||||||
https://github.com/chrisjrn/registrasion/tarball/master#egg=registrasion
|
https://github.com/chrisjrn/registrasion/tarball/master#egg=registrasion
|
||||||
https://github.com/pinax/symposion/tarball/ad81810#egg=symposion
|
https://github.com/chrisjrn/symposion/tarball/northbaypython#egg=symposion
|
||||||
https://github.com/chrisjrn/registrasion-stripe/tarball/master#egg=registrasion-stripe
|
https://github.com/chrisjrn/registrasion-stripe/tarball/master#egg=registrasion-stripe
|
||||||
https://github.com/chrisjrn/symposion-bootstrap-templates/tarball/master#egg=symposion-bootstrap-templates
|
https://github.com/chrisjrn/symposion-bootstrap-templates/tarball/master#egg=symposion-bootstrap-templates
|
||||||
|
|
Loading…
Reference in a new issue