From 4cf869c9fa74e776c7984196aa7af4c196df5ecb Mon Sep 17 00:00:00 2001 From: Ben Sturmfels Date: Sat, 15 Apr 2023 14:54:11 +1000 Subject: [PATCH] Prototype talk proposal forms for "Copyleft and Compliance" and "SFC Member Project" streams --- pinaxcon/proposals/forms.py | 25 +++++++++ ...omplianceproposal_memberprojectproposal.py | 55 +++++++++++++++++++ pinaxcon/proposals/models.py | 40 ++++++++++++++ pinaxcon/settings.py | 2 + 4 files changed, 122 insertions(+) create mode 100644 pinaxcon/proposals/migrations/0005_copyleftcomplianceproposal_memberprojectproposal.py diff --git a/pinaxcon/proposals/forms.py b/pinaxcon/proposals/forms.py index d1184b4a..3578fd17 100644 --- a/pinaxcon/proposals/forms.py +++ b/pinaxcon/proposals/forms.py @@ -23,6 +23,10 @@ DEFAULT_FIELDS = [ "materials_release", ] +TALK_FORMAT_FIELDS = copy.copy(DEFAULT_FIELDS) +TALK_FORMAT_FIELDS.insert(2, "talk_format") +TALK_FORMAT_FIELDS.append("ticket_acknowledgement") + class ProposalForm(forms.ModelForm): required_css_class = 'label-required' @@ -48,3 +52,24 @@ class TutorialProposalForm(ProposalForm): class Meta: model = models.TutorialProposal fields = copy.copy(DEFAULT_FIELDS) + + +class MiniconfProposalForm(ProposalForm): + + def __init__(self, *a, **k): + super(MiniconfProposalForm, self).__init__(*a, **k) + self.fields['ticket_acknowledgement'].required = True + + +class CopyleftComplianceProposalForm(MiniconfProposalForm): + + class Meta: + model = models.CopyleftComplianceProposal + fields = TALK_FORMAT_FIELDS + + +class MemberProjectProposalForm(MiniconfProposalForm): + + class Meta: + model = models.MemberProjectProposal + fields = TALK_FORMAT_FIELDS diff --git a/pinaxcon/proposals/migrations/0005_copyleftcomplianceproposal_memberprojectproposal.py b/pinaxcon/proposals/migrations/0005_copyleftcomplianceproposal_memberprojectproposal.py new file mode 100644 index 00000000..c2c99ea1 --- /dev/null +++ b/pinaxcon/proposals/migrations/0005_copyleftcomplianceproposal_memberprojectproposal.py @@ -0,0 +1,55 @@ +# Generated by Django 2.2.28 on 2023-04-15 04:51 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('symposion_proposals', '0003_auto_20170702_2250'), + ('proposals', '0004_auto_20221208_0102'), + ] + + operations = [ + migrations.CreateModel( + name='CopyleftComplianceProposal', + 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 Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International ( CC BY-NC-SA 4.0) licence.")), + ('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 Creative Commons Attribution-Share Alike Australia 3.0 Licence")), + ('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, '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?')), + ('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')), + ('content_warning_html', models.TextField(blank=True)), + ('talk_format', models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')), + ('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation, as linux.conf.au miniconfs are unfunded community run events.')), + ], + options={ + 'verbose_name': 'Copyleft and Compliance talk proposal', + }, + bases=('symposion_proposals.proposalbase',), + ), + migrations.CreateModel( + name='MemberProjectProposal', + 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 Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International ( CC BY-NC-SA 4.0) licence.")), + ('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 Creative Commons Attribution-Share Alike Australia 3.0 Licence")), + ('primary_topic', models.IntegerField(choices=[(1, 'Linux'), (2, 'Software'), (3, 'Hardware'), (4, 'Firmware'), (5, 'System Administration / Operations'), (6, 'Security'), (7, 'Documentation'), (8, 'Community'), (9, 'Science & Data'), (10, 'Galleries, Libraries, Archives & Museums (GLAM)'), (11, 'Multimedia'), (12, 'Aerospace / UAV'), (13, 'Agriculture'), (14, '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?')), + ('content_warning', models.TextField(blank=True, help_text='This will be shown on the schedule to give attendees advanced warning of topics covered in the session. ', verbose_name='Content Warning')), + ('content_warning_html', models.TextField(blank=True)), + ('talk_format', models.IntegerField(choices=[(1, 'Lightning Talk (5-10 min)'), (2, 'Short Presentation (20-25 min)'), (3, 'Presentation (40-45 min)')], default=3, help_text='Please indicate your preferred talk length in the private abstract field below.')), + ('ticket_acknowledgement', models.BooleanField(default=False, help_text='I understand that I will be required to purchase a conference ticket and arrange my own travel and accommodation, as linux.conf.au miniconfs are unfunded community run events.')), + ], + options={ + 'verbose_name': 'SFC Member Project talk proposal', + }, + bases=('symposion_proposals.proposalbase',), + ), + ] diff --git a/pinaxcon/proposals/models.py b/pinaxcon/proposals/models.py index 523782be..8e5d97a5 100644 --- a/pinaxcon/proposals/models.py +++ b/pinaxcon/proposals/models.py @@ -127,3 +127,43 @@ class TutorialProposal(Proposal): class Meta: verbose_name = "tutorial proposal" + + +class MiniconfSessionProposal(Proposal): + + FORMAT_SHORT_PRESENTATION = 1 + FORMAT_MEDIUM_PRESENTATION = 2 + FORMAT_LONG_PRESENTATION = 3 + FORMAT_DEMONSTRATION = 4 + FORMAT_OTHER = 5 + + TALK_FORMATS = [ + (FORMAT_SHORT_PRESENTATION, "Lightning Talk (5-10 min)"), + (FORMAT_MEDIUM_PRESENTATION, "Short Presentation (20-25 min)"), + (FORMAT_LONG_PRESENTATION, "Presentation (40-45 min)"), + ] + + 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." + ) + + ticket_acknowledgement = models.BooleanField( + default=False, + help_text="I understand that I will be required to purchase a conference ticket " + "and arrange my own travel and accommodation, as linux.conf.au miniconfs are unfunded community run events." + ) + + class Meta: + abstract = True + + +class CopyleftComplianceProposal(MiniconfSessionProposal): + class Meta: + verbose_name = "Copyleft and Compliance talk proposal" + + +class MemberProjectProposal(MiniconfSessionProposal): + class Meta: + verbose_name = "SFC Member Project talk proposal" diff --git a/pinaxcon/settings.py b/pinaxcon/settings.py index 452ea942..2e806ccc 100644 --- a/pinaxcon/settings.py +++ b/pinaxcon/settings.py @@ -363,6 +363,8 @@ CONFERENCE_ID = 1 PROPOSAL_FORMS = { "talk": "pinaxcon.proposals.forms.TalkProposalForm", "tutorial": "pinaxcon.proposals.forms.TutorialProposalForm", + "copyleft-compliance": "pinaxcon.proposals.forms.CopyleftComplianceProposalForm", + "sfc-member-project": "pinaxcon.proposals.forms.MemberProjectProposalForm", } MAIN_CONFERENCE_PROPOSAL_KINDS = ("Talk",)