Changeset - f60e37072525
[Not reviewed]
0 5 1
Joel Addison - 3 years ago 2021-08-09 11:12:43
joel@addison.net.au
Setup LCA2022 Miniconfs
6 files changed with 310 insertions and 39 deletions:
0 comments (0 inline, 0 general)
pinaxcon/proposals/admin.py
Show inline comments
...
 
@@ -25,6 +25,10 @@ models_to_register = [
 
    models.TutorialProposal,
 
    models.MiniconfProposal,
 
    ### LCA2022 Miniconfs
 
    models.GlamCommunityProposal,
 
    models.KernelProposal,
 
    models.OpenHardwareProposal,
 
    models.SysAdminProposal,
 
]
 

	
 
for model in models_to_register:
pinaxcon/proposals/forms.py
Show inline comments
...
 
@@ -8,20 +8,21 @@ from pinaxcon.proposals import models
 

	
 
DEFAULT_FIELDS =  [
 
    "title",
 
    "primary_topic",
 
    "target_audience",
 
    "experience_level",
 
    "abstract",
 
    "private_abstract",
 
    "technical_requirements",
 
    "project",
 
    "project_url",
 
    "video_url",
 
    "require_approval",
 
    "recording_release",
 
    "materials_release",
 
]
 

	
 
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):
 

	
...
 
@@ -66,7 +67,39 @@ class MiniconfProposalForm(ProposalForm):
 
### LCA2022 Miniconfs
 

	
 
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):
 
        super(MiniconfSessionProposalForm, self).__init__(*a, **k)
 
        self.fields['ticket_acknowledgement'].required = True
 
        super(OpenHardwareProposalForm, self).__init__(*a, **k)
 
        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
pinaxcon/proposals/migrations/0004_auto_20210809_2026.py
Show inline comments
 
new file 100644
 
# 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,
 
        ),
 
    ]
pinaxcon/proposals/models.py
Show inline comments
...
 
@@ -11,19 +11,23 @@ class Proposal(ProposalBase):
 
    TARGET_DEVELOPER = 4
 

	
 
    TARGET_AUDIENCES = [
 
        (TARGET_USER, "User"),
 
        (TARGET_BUSINESS, "Business"),
 
        (TARGET_COMMUNITY, "Community"),
 
        (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(
 
        default=True,
 
        help_text="I allow Linux Australia to release any recordings of "
 
        "presentations covered by this proposal, under the <a "
 
        "href='https://creativecommons.org/licenses/by-sa/3.0/au/deed.en'> "
 
        "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>"
 
    )
 

	
...
 
@@ -40,19 +44,82 @@ class Proposal(ProposalBase):
 
        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:
 
        verbose_name = "talk proposal"
 

	
 

	
 
class TutorialProposal(Proposal):
 
class TutorialProposal(SessionProposal):
 

	
 
    class Meta:
 
        verbose_name = "tutorial 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,
 
                                          default=Proposal.TARGET_DEVELOPER)
...
 
@@ -61,27 +128,51 @@ class MiniconfProposal(Proposal):
 
        verbose_name = "miniconf proposal"
 

	
 

	
 
class MiniconfSessionProposal(Proposal):
 
class MiniconfSessionProposal(SessionProposal):
 
    """
 
    Base Miniconf Session Proposal
 
    """
 

	
 
    FORMAT_SHORT_PRESENTATION = 1
 
    FORMAT_LONG_PRESENTATION = 2
 
    class Meta:
 
        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 = [
 
        (FORMAT_SHORT_PRESENTATION, "Short Presentation (15 or 20 min)"),
 
        (FORMAT_LONG_PRESENTATION, "Long Presentation (45 min)"),
 
        (FORMAT_PRESENTATION, "Presentation"),
 
        (FORMAT_TUTORIAL, "Tutorial"),
 
        (FORMAT_HANDS_ON, "Hands-on"),
 
    ]
 

	
 
    talk_format = models.IntegerField(
 
        choices=TALK_FORMATS,
 
        default=FORMAT_LONG_PRESENTATION,
 
        help_text="Please indicate your preferred talk length in the private abstract field below."
 
        default=FORMAT_PRESENTATION,
 
        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:
 
        verbose_name = "Open Hardware Miniconf Proposal"
 

	
 

	
 
class SysAdminProposal(MiniconfSessionProposal):
 

	
 
    class Meta:
 
        abstract = True
 
        verbose_name = "System Administration Miniconf Proposal"
pinaxcon/settings.py
Show inline comments
...
 
@@ -365,6 +365,10 @@ PROPOSAL_FORMS = {
 
    "tutorial": "pinaxcon.proposals.forms.TutorialProposalForm",
 
    "miniconf": "pinaxcon.proposals.forms.MiniconfProposalForm",
 
    ### 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")
 

	
pinaxcon/templates/symposion/proposals/_proposal_fields.html
Show inline comments
...
 
@@ -8,27 +8,28 @@
 
</div>
 

	
 
<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">
 
    {% if proposal.cancelled %}
 
    <p class="badge-danger">WITHDRAWN</p>
 
    {% else %}
 
    <p class="badge-success">Not withdrawn</p>
 
    {% endif %}
 
    <p>
 
      {{ proposal.status }}
 
      {% if proposal.cancelled %}
 
      <span class="badge-danger">WITHDRAWN</p>
 
      {% endif %}
 
    </p>
 
  </div>
 
</div>
 

	
 
<div class="row">
 
  <label class="list-label col-md-2">Submitted by</label>
 
  <label class="list-label col-md-2">Proposal Type</label>
 
  <div class="col-md-10">
 
    <p>{{ proposal.speaker }} &lt;{{ proposal.speaker.email }}&gt;</p>
 
    <p>{{ proposal.kind.name|capfirst }}</p>
 
  </div>
 
</div>
 

	
 
<div class="row">
 
  <label class="list-label col-md-2">Proposal Type</label>
 
  <label class="list-label col-md-2">Primary Topic</label>
 
  <div class="col-md-10">
 
    <p>{{ proposal.kind.name|capfirst }}</p>
 
    <p>{{ proposal.get_primary_topic_display }}&nbsp;</p>
 
  </div>
 
</div>
 

	
...
 
@@ -39,6 +40,13 @@
 
  </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 %}
 
<div class="row">
 
  <label class="list-label col-md-2">Talk Format</label>
...
 
@@ -48,14 +56,12 @@
 
</div>
 
{% endif %}
 

	
 
{% if proposal.experience_level %}
 
<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">
 
    <p>{{ proposal.get_experience_level_display }}</p>
 
    <p>{{ proposal.speaker }} &lt;{{ proposal.speaker.email }}&gt;</p>
 
  </div>
 
</div>
 
{% endif %}
 

	
 
{% if proposal.additional_speakers.all %}
 
<div class="row">
...
 
@@ -149,6 +155,13 @@
 
  </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">
 
  <label class="list-label col-md-2">Recording Release</label>
 
  <div class="col-md-10">
0 comments (0 inline, 0 general)