Setup LCA2022 Miniconfs

This commit is contained in:
Joel Addison 2021-08-09 21:12:43 +10:00
parent 244bb87b8c
commit f60e370725
6 changed files with 314 additions and 43 deletions

View file

@ -25,6 +25,10 @@ models_to_register = [
models.TutorialProposal, models.TutorialProposal,
models.MiniconfProposal, models.MiniconfProposal,
### LCA2022 Miniconfs ### LCA2022 Miniconfs
models.GlamCommunityProposal,
models.KernelProposal,
models.OpenHardwareProposal,
models.SysAdminProposal,
] ]
for model in models_to_register: for model in models_to_register:

View file

@ -8,20 +8,21 @@ from pinaxcon.proposals import models
DEFAULT_FIELDS = [ DEFAULT_FIELDS = [
"title", "title",
"primary_topic",
"target_audience", "target_audience",
"experience_level",
"abstract", "abstract",
"private_abstract", "private_abstract",
"technical_requirements", "technical_requirements",
"project", "project",
"project_url", "project_url",
"video_url", "video_url",
"require_approval",
"recording_release", "recording_release",
"materials_release", "materials_release",
] ]
MINICONF_SESSION_FORMAT_FIELDS = copy.copy(DEFAULT_FIELDS) MINICONF_SESSION_FORMAT_FIELDS = copy.copy(DEFAULT_FIELDS)
MINICONF_SESSION_FORMAT_FIELDS.insert(2, "talk_format")
MINICONF_SESSION_FORMAT_FIELDS.append("ticket_acknowledgement")
class ProposalForm(forms.ModelForm): class ProposalForm(forms.ModelForm):
@ -66,7 +67,39 @@ class MiniconfProposalForm(ProposalForm):
### LCA2022 Miniconfs ### LCA2022 Miniconfs
class MiniconfSessionProposalForm(ProposalForm): class MiniconfSessionProposalForm(ProposalForm):
pass
class GlamCommunityProposalForm(MiniconfSessionProposalForm):
class Meta:
model = models.GlamCommunityProposal
fields = MINICONF_SESSION_FORMAT_FIELDS
class KernelProposalForm(MiniconfSessionProposalForm):
class Meta:
model = models.KernelProposal
fields = MINICONF_SESSION_FORMAT_FIELDS
HARDWARE_FIELDS = copy.copy(MINICONF_SESSION_FORMAT_FIELDS)
HARDWARE_FIELDS.insert(4, "talk_format")
class OpenHardwareProposalForm(MiniconfSessionProposalForm):
def __init__(self, *a, **k): def __init__(self, *a, **k):
super(MiniconfSessionProposalForm, self).__init__(*a, **k) super(OpenHardwareProposalForm, self).__init__(*a, **k)
self.fields['ticket_acknowledgement'].required = True self.fields['talk_format'].required = True
class Meta:
model = models.OpenHardwareProposal
fields = HARDWARE_FIELDS
class SysAdminProposalForm(MiniconfSessionProposalForm):
class Meta:
model = models.SysAdminProposal
fields = MINICONF_SESSION_FORMAT_FIELDS

View file

@ -0,0 +1,126 @@
# Generated by Django 2.2.24 on 2021-08-09 10:26
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('symposion_proposals', '0004_auto_20210809_2026'),
('proposals', '0003_auto_20170702_2227'),
]
operations = [
migrations.CreateModel(
name='SessionProposal',
fields=[
('proposalbase_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='symposion_proposals.ProposalBase')),
('target_audience', models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], help_text='Who is the target audience for your session?')),
('recording_release', models.BooleanField(default=True, help_text="I allow Linux Australia to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('materials_release', models.BooleanField(default=True, help_text="I allow Linux Australia to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>")),
('primary_topic', models.IntegerField(choices=[(1, 'Software'), (2, 'Hardware'), (3, 'Firmware'), (4, 'Linux Kernel'), (5, 'Documentation'), (6, 'Community'), (7, 'Security'), (8, 'Deployment & Operations'), (9, 'Other')], help_text='What is the primary topic area for your session?')),
('experience_level', models.IntegerField(choices=[(1, 'Beginner'), (2, 'Intermediate'), (3, 'Advanced')], help_text='What level of experience will your session be pitched at?')),
('require_approval', models.BooleanField(default=False, help_text='Do you require further approval from your employer or institution before you can confirm your availability to present?')),
],
options={
'abstract': False,
},
bases=('symposion_proposals.proposalbase',),
),
migrations.RemoveField(
model_name='talkproposal',
name='materials_release',
),
migrations.RemoveField(
model_name='talkproposal',
name='proposalbase_ptr',
),
migrations.RemoveField(
model_name='talkproposal',
name='recording_release',
),
migrations.RemoveField(
model_name='talkproposal',
name='target_audience',
),
migrations.RemoveField(
model_name='tutorialproposal',
name='materials_release',
),
migrations.RemoveField(
model_name='tutorialproposal',
name='proposalbase_ptr',
),
migrations.RemoveField(
model_name='tutorialproposal',
name='recording_release',
),
migrations.RemoveField(
model_name='tutorialproposal',
name='target_audience',
),
migrations.AlterField(
model_name='miniconfproposal',
name='recording_release',
field=models.BooleanField(default=True, help_text="I allow Linux Australia to release any recordings of presentations covered by this proposal, on YouTube under the standard YouTube licence, and on other platforms under the <a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>"),
),
migrations.AlterField(
model_name='miniconfproposal',
name='target_audience',
field=models.IntegerField(choices=[(4, 'Developer'), (3, 'Community'), (1, 'End User'), (2, 'Business')], default=4),
),
migrations.CreateModel(
name='GlamCommunityProposal',
fields=[
('sessionproposal_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='proposals.SessionProposal')),
],
options={
'verbose_name': 'GO GLAM Miniconf Proposal',
},
bases=('proposals.sessionproposal',),
),
migrations.CreateModel(
name='KernelProposal',
fields=[
('sessionproposal_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='proposals.SessionProposal')),
],
options={
'verbose_name': 'Kernel Miniconf Proposal',
},
bases=('proposals.sessionproposal',),
),
migrations.CreateModel(
name='OpenHardwareProposal',
fields=[
('sessionproposal_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='proposals.SessionProposal')),
('talk_format', models.IntegerField(choices=[(1, 'Presentation'), (2, 'Tutorial'), (3, 'Hands-on')], default=1, help_text='Will your session be a presentation, tutorial or hands-on (e.g how to use KiCAD or some other tooling)?')),
],
options={
'verbose_name': 'Open Hardware Miniconf Proposal',
},
bases=('proposals.sessionproposal',),
),
migrations.CreateModel(
name='SysAdminProposal',
fields=[
('sessionproposal_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='proposals.SessionProposal')),
],
options={
'verbose_name': 'System Administration Miniconf Proposal',
},
bases=('proposals.sessionproposal',),
),
migrations.AddField(
model_name='talkproposal',
name='sessionproposal_ptr',
field=models.OneToOneField(auto_created=True, default=0, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='proposals.SessionProposal'),
preserve_default=False,
),
migrations.AddField(
model_name='tutorialproposal',
name='sessionproposal_ptr',
field=models.OneToOneField(auto_created=True, default=0, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='proposals.SessionProposal'),
preserve_default=False,
),
]

View file

@ -11,19 +11,23 @@ class Proposal(ProposalBase):
TARGET_DEVELOPER = 4 TARGET_DEVELOPER = 4
TARGET_AUDIENCES = [ TARGET_AUDIENCES = [
(TARGET_USER, "User"),
(TARGET_BUSINESS, "Business"),
(TARGET_COMMUNITY, "Community"),
(TARGET_DEVELOPER, "Developer"), (TARGET_DEVELOPER, "Developer"),
(TARGET_COMMUNITY, "Community"),
(TARGET_USER, "End User"),
(TARGET_BUSINESS, "Business"),
] ]
target_audience = models.IntegerField(choices=TARGET_AUDIENCES) target_audience = models.IntegerField(
choices=TARGET_AUDIENCES,
help_text="Who is the target audience for your session?",
)
recording_release = models.BooleanField( recording_release = models.BooleanField(
default=True, default=True,
help_text="I allow Linux Australia to release any recordings of " help_text="I allow Linux Australia to release any recordings of "
"presentations covered by this proposal, under the <a " "presentations covered by this proposal, on YouTube under the "
"href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> " "standard YouTube licence, and on other platforms under the "
"<a href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> "
"Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>" "Creative Commons Attribution-Share Alike Australia 3.0 Licence</a>"
) )
@ -40,19 +44,82 @@ class Proposal(ProposalBase):
abstract = True abstract = True
class TalkProposal(Proposal): class SessionProposal(Proposal):
"""
Base Session Proposal
This is not a meta class as we want a single table to store the common
data across all session proposal types.
"""
TOPIC_SOFTWARE = 1
TOPIC_HARDWARE = 2
TOPIC_FIRMWARE = 3
TOPIC_KERNEL = 4
TOPIC_DOCUMENTATION = 5
TOPIC_COMMUNITY = 6
TOPIC_SECURITY = 7
TOPIC_OPERATIONS = 8
TOPIC_OTHER = 9
PROPOSAL_TOPIC = [
(TOPIC_SOFTWARE, "Software"),
(TOPIC_HARDWARE, "Hardware"),
(TOPIC_FIRMWARE, "Firmware"),
(TOPIC_KERNEL, "Linux Kernel"),
(TOPIC_DOCUMENTATION, "Documentation"),
(TOPIC_COMMUNITY, "Community"),
(TOPIC_SECURITY, "Security"),
(TOPIC_OPERATIONS, "Deployment & Operations"),
(TOPIC_OTHER, "Other"),
]
LEVEL_BEGINNER = 1
LEVEL_INTERMEDIATE = 2
LEVEL_ADVANCED = 3
EXPERIENCE_LEVEL = [
(LEVEL_BEGINNER, "Beginner"),
(LEVEL_INTERMEDIATE, "Intermediate"),
(LEVEL_ADVANCED, "Advanced"),
]
primary_topic = models.IntegerField(
choices=PROPOSAL_TOPIC,
help_text="What is the primary topic area for your session?"
)
experience_level = models.IntegerField(
choices=EXPERIENCE_LEVEL,
help_text="What level of experience will your session be pitched at?"
)
require_approval = models.BooleanField(
default=False,
help_text="Do you require further approval from your employer or "
"institution before you can confirm your availability to present?"
)
class TalkProposal(SessionProposal):
class Meta: class Meta:
verbose_name = "talk proposal" verbose_name = "talk proposal"
class TutorialProposal(Proposal): class TutorialProposal(SessionProposal):
class Meta: class Meta:
verbose_name = "tutorial proposal" verbose_name = "tutorial proposal"
class MiniconfProposal(Proposal): class MiniconfProposal(Proposal):
"""
Miniconf Proposal
Note that this is just a Proposal, not a SessionProposal, as it does not
require a number of fields that the others use.
"""
target_audience = models.IntegerField(choices=Proposal.TARGET_AUDIENCES, target_audience = models.IntegerField(choices=Proposal.TARGET_AUDIENCES,
default=Proposal.TARGET_DEVELOPER) default=Proposal.TARGET_DEVELOPER)
@ -61,27 +128,51 @@ class MiniconfProposal(Proposal):
verbose_name = "miniconf proposal" verbose_name = "miniconf proposal"
class MiniconfSessionProposal(Proposal): class MiniconfSessionProposal(SessionProposal):
"""
Base Miniconf Session Proposal
"""
FORMAT_SHORT_PRESENTATION = 1 class Meta:
FORMAT_LONG_PRESENTATION = 2 abstract = True
class GlamCommunityProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "GO GLAM Miniconf Proposal"
class KernelProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Kernel Miniconf Proposal"
class OpenHardwareProposal(MiniconfSessionProposal):
FORMAT_PRESENTATION = 1
FORMAT_TUTORIAL = 2
FORMAT_HANDS_ON = 3
TALK_FORMATS = [ TALK_FORMATS = [
(FORMAT_SHORT_PRESENTATION, "Short Presentation (15 or 20 min)"), (FORMAT_PRESENTATION, "Presentation"),
(FORMAT_LONG_PRESENTATION, "Long Presentation (45 min)"), (FORMAT_TUTORIAL, "Tutorial"),
(FORMAT_HANDS_ON, "Hands-on"),
] ]
talk_format = models.IntegerField( talk_format = models.IntegerField(
choices=TALK_FORMATS, choices=TALK_FORMATS,
default=FORMAT_LONG_PRESENTATION, default=FORMAT_PRESENTATION,
help_text="Please indicate your preferred talk length in the private abstract field below." help_text="Will your session be a presentation, tutorial or hands-on "
) "(e.g how to use KiCAD or some other tooling)?"
ticket_acknowledgement = models.BooleanField(
default=False,
help_text="I understand that I may be required to purchase a conference ticket "
"as linux.conf.au miniconfs are unfunded community run events."
) )
class Meta: class Meta:
abstract = True verbose_name = "Open Hardware Miniconf Proposal"
class SysAdminProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "System Administration Miniconf Proposal"

View file

@ -365,6 +365,10 @@ PROPOSAL_FORMS = {
"tutorial": "pinaxcon.proposals.forms.TutorialProposalForm", "tutorial": "pinaxcon.proposals.forms.TutorialProposalForm",
"miniconf": "pinaxcon.proposals.forms.MiniconfProposalForm", "miniconf": "pinaxcon.proposals.forms.MiniconfProposalForm",
### LCA2022 Miniconfs ### LCA2022 Miniconfs
"glam-community-miniconf": "pinaxcon.proposals.forms.GlamCommunityProposalForm",
"kernel-miniconf": "pinaxcon.proposals.forms.KernelProposalForm",
"open-hardware-miniconf": "pinaxcon.proposals.forms.OpenHardwareProposalForm",
"sysadmin-miniconf": "pinaxcon.proposals.forms.SysAdminProposalForm",
} }
MAIN_CONFERENCE_PROPOSAL_KINDS = ("Talk", "Miniconf") MAIN_CONFERENCE_PROPOSAL_KINDS = ("Talk", "Miniconf")

View file

@ -8,20 +8,14 @@
</div> </div>
<div class="row"> <div class="row">
<label class="list-label col-md-2">Withdrawn</label> <label class="list-label col-md-2">Status</label>
<div class="col-md-10"> <div class="col-md-10">
{% if proposal.cancelled %} <p>
<p class="badge-danger">WITHDRAWN</p> {{ proposal.status }}
{% else %} {% if proposal.cancelled %}
<p class="badge-success">Not withdrawn</p> <span class="badge-danger">WITHDRAWN</p>
{% endif %} {% endif %}
</div> </p>
</div>
<div class="row">
<label class="list-label col-md-2">Submitted by</label>
<div class="col-md-10">
<p>{{ proposal.speaker }} &lt;{{ proposal.speaker.email }}&gt;</p>
</div> </div>
</div> </div>
@ -32,6 +26,13 @@
</div> </div>
</div> </div>
<div class="row">
<label class="list-label col-md-2">Primary Topic</label>
<div class="col-md-10">
<p>{{ proposal.get_primary_topic_display }}&nbsp;</p>
</div>
</div>
<div class="row"> <div class="row">
<label class="list-label col-md-2">Target Audience</label> <label class="list-label col-md-2">Target Audience</label>
<div class="col-md-10"> <div class="col-md-10">
@ -39,6 +40,13 @@
</div> </div>
</div> </div>
<div class="row">
<label class="list-label col-md-2">Experience Level</label>
<div class="col-md-10">
<p>{{ proposal.get_experience_level_display }}</p>
</div>
</div>
{% if proposal.talk_format %} {% if proposal.talk_format %}
<div class="row"> <div class="row">
<label class="list-label col-md-2">Talk Format</label> <label class="list-label col-md-2">Talk Format</label>
@ -48,14 +56,12 @@
</div> </div>
{% endif %} {% endif %}
{% if proposal.experience_level %}
<div class="row"> <div class="row">
<label class="list-label col-md-2">Experience Level</label> <label class="list-label col-md-2">Submitted by</label>
<div class="col-md-10"> <div class="col-md-10">
<p>{{ proposal.get_experience_level_display }}</p> <p>{{ proposal.speaker }} &lt;{{ proposal.speaker.email }}&gt;</p>
</div> </div>
</div> </div>
{% endif %}
{% if proposal.additional_speakers.all %} {% if proposal.additional_speakers.all %}
<div class="row"> <div class="row">
@ -149,6 +155,13 @@
</div> </div>
</div> </div>
<div class="row">
<label class="list-label col-md-2">Requires approval from employer?</label>
<div class="col-md-10">
<p>{{ proposal.require_approval }}&nbsp;</p>
</div>
</div>
<div class="row"> <div class="row">
<label class="list-label col-md-2">Recording Release</label> <label class="list-label col-md-2">Recording Release</label>
<div class="col-md-10"> <div class="col-md-10">