Compare commits

..

6 commits

17 changed files with 290 additions and 135 deletions

View file

@ -1,10 +1,41 @@
Export any reports you want to keep.
# Rolling over for a new conference
Take a database dump:
This website collects a limited amount of personally identifiable information for the purposes of organizing a conference. In the interests of security, we've chosen to reset the site for each conference to limit the amount of information that could potentially ever be exposed in the event of a vulnerability.
## Step 1: Take a snapshot of the public conference site
Method described here:
https://f.sfconservancy.org/Conservancy/2024.fossy.us/src/branch/main/README.md
## Step 2: Download any reports for archive use
This might include the attendees, talks proposed and speakers.
## Step 3: Take a database backup
This is useful in case we miss something. Run:
fab download-postgres-db
Remove all accounts, tickets, invoices, talks, etc. I used the commands below, but this may be simpler to achieve by selecting the relevant users in the Django Admin, selecting "Delete" and letting the cascading deletes deal with it.
## Step 4: Delete any uploaded files/reports
On the server, run:
rm -rf /srv/symposion_app/site_media/*
## Step 4: Reset the database
Remove all accounts, tickets, invoices, talks, etc.
Probably the easiest approach is to select and delete all non-staff "User" records via Django Admin and letting the cascading deletes handle any relationships.
I've previously also used the commands below:
```
$ sudo -u postgres psql symposion
@ -70,9 +101,12 @@ delete from auth_user where is_staff = false;
Set any remaining account `completed_registration` to false.
# Step 5: Update conference details and dates
Add a new Conference entry in Django Admin and update the `CONFERENCE_ID` in pinaxcon/settings.py. Also update the conference dates.
Find and update all uses of 2025 and the conference dates in this codebase.
Find and update all uses of 2026 and the conference dates in this codebase.
Update flatpages such as the "/" home page.

9
fabfile.py vendored
View file

@ -75,13 +75,10 @@ ns.configure({
# Built-in Fabric config.
'run': {
'echo': True,
# Needed so local commands work. Can also use FABRIC_RUN_REPLACE_ENV.
'replace_env': False,
},
# Our custom project config.
'env': {
'branch': 'fossy2025',
'branch': 'fossy2026',
'app_user': 'www-data',
'db_name': 'symposion',
'project_dir': '/srv/symposion_app',
@ -93,7 +90,7 @@ ns.configure({
'uwsgi_conf': 'deploy/uwsgi.ini',
'nginx_conf': 'deploy/nginx.conf',
'python': '/usr/bin/python3.11',
'url': 'https://2025.fossy.us/',
'domain': '2025.fossy.us',
'url': 'https://2026.fossy.ca/',
'domain': '2026.fossy.ca',
},
})

View file

@ -3,9 +3,9 @@
"model": "symposion_conference.conference",
"pk": 1,
"fields": {
"title": "FOSSY 2025",
"start_date": "2025-07-31",
"end_date": "2025-08-03",
"title": "FOSSY 2026",
"start_date": "2026-08-06",
"end_date": "2026-08-09",
"timezone": "US/Pacific"
}
}

View file

@ -3,8 +3,8 @@
"model": "sites.site",
"pk": 1,
"fields": {
"domain": "2025.fossy.us",
"name": "FOSSY 2025"
"domain": "2026.fossy.ca",
"name": "FOSSY 2026"
}
}
]

View file

@ -21,17 +21,12 @@ class CategoryAdmin(admin.ModelAdmin):
models_to_register = [
models.CampKDEProposal,
models.DatabasesProposal,
models.DistrosProposal,
models.FOSSInDailyLifeProposal,
models.FOSSInEducationProposal,
models.LegalIssuesProposal,
models.LibreGraphicsProposal,
models.LinuxKernalProposal,
models.MobileDevicesProposal,
models.P2PLocalFirstProposal,
models.ScienceOfCommunityProposal,
models.SupportingUserGroupsProposal,
models.LinuxKernelProposal,
models.OpenSourceGovernanceAndCommunitySustainabilityProposal,
models.RightToRepairProposal,
models.WildCardProposal,
models.XMPPProposal,
]

View file

@ -61,15 +61,15 @@ class MiniconfProposalForm(ProposalForm):
pass
class DatabasesProposalForm(MiniconfProposalForm):
class CampKDEProposalForm(MiniconfProposalForm):
class Meta:
model = models.DatabasesProposal
model = models.CampKDEProposal
fields = TALK_FORMAT_FIELDS
class DistrosProposalForm(MiniconfProposalForm):
class DatabasesProposalForm(MiniconfProposalForm):
class Meta:
model = models.DistrosProposal
model = models.DatabasesProposal
fields = TALK_FORMAT_FIELDS
@ -79,57 +79,21 @@ class FOSSInDailyLifeProposalForm(MiniconfProposalForm):
fields = TALK_FORMAT_FIELDS
class FOSSInEducationProposalForm(MiniconfProposalForm):
class Meta:
model = models.FOSSInEducationProposal
fields = TALK_FORMAT_FIELDS
class LegalIssuesProposalForm(MiniconfProposalForm):
class Meta:
model = models.LegalIssuesProposal
fields = TALK_FORMAT_FIELDS
class LibreGraphicsProposalForm(MiniconfProposalForm):
class Meta:
model = models.LibreGraphicsProposal
fields = TALK_FORMAT_FIELDS
class LinuxKernelProposalForm(MiniconfProposalForm):
class Meta:
model = models.LinuxKernalProposal
model = models.LinuxKernelProposal
fields = TALK_FORMAT_FIELDS
class MobileDevicesProposalForm(MiniconfProposalForm):
class OpenSourceGovernanceAndCommunitySustainabilityProposalForm(MiniconfProposalForm):
class Meta:
model = models.MobileDevicesProposal
model = models.OpenSourceGovernanceAndCommunitySustainabilityProposal
fields = TALK_FORMAT_FIELDS
class P2PLocalFirstProposalForm(MiniconfProposalForm):
class RightToRepairProposalForm(MiniconfProposalForm):
class Meta:
model = models.P2PLocalFirstProposal
fields = TALK_FORMAT_FIELDS
class ScienceOfCommunityProposalForm(MiniconfProposalForm):
class Meta:
model = models.ScienceOfCommunityProposal
fields = TALK_FORMAT_FIELDS
class SupportingUserGroupsProposalForm(MiniconfProposalForm):
class Meta:
model = models.SupportingUserGroupsProposal
fields = TALK_FORMAT_FIELDS
class XMPPProposalForm(MiniconfProposalForm):
class Meta:
model = models.XMPPProposal
model = models.RightToRepairProposal
fields = TALK_FORMAT_FIELDS
@ -137,3 +101,9 @@ class WildCardProposalForm(MiniconfProposalForm):
class Meta:
model = models.WildCardProposal
fields = TALK_FORMAT_FIELDS
class XMPPProposalForm(MiniconfProposalForm):
class Meta:
model = models.XMPPProposal
fields = TALK_FORMAT_FIELDS

View file

@ -0,0 +1,138 @@
# Generated by Django 2.2.28 on 2026-03-19 06:40
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('symposion_schedule', '0009_presentation_videos'),
('symposion_speakers', '0014_auto_20260319_0640'),
('symposion_proposals', '0004_auto_20260319_0640'),
('symposion_reviews', '0001_initial'),
('proposals', '0018_mobiledevicesproposal'),
]
operations = [
migrations.CreateModel(
name='CampKDEProposal',
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 Software Freedom Conservancy 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 (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>")),
('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?', null=True)),
('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, 'Long 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.')),
],
options={
'verbose_name': 'Camp KDE talk proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='OpenSourceGovernanceAndCommunitySustainabilityProposal',
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 Software Freedom Conservancy 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 (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>")),
('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?', null=True)),
('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, 'Long 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.')),
],
options={
'verbose_name': 'Open Source Governance and Community Sustainability talk proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.CreateModel(
name='RightToRepairProposal',
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 Software Freedom Conservancy 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 (<a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'> CC BY-NC-SA 4.0</a>) licence.")),
('materials_release', models.BooleanField(default=True, help_text="I allow Software Freedom Conservancy to release any other material (such as slides) from presentations covered by this proposal, under the <a href='https://creativecommons.org/licenses/by-sa/4.0/'> Creative Commons Attribution-ShareAlike 4.0 International</a>")),
('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?', null=True)),
('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, 'Long 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.')),
],
options={
'verbose_name': 'Right to Repair talk proposal',
},
bases=('symposion_proposals.proposalbase',),
),
migrations.RenameModel(
old_name='LinuxKernalProposal',
new_name='LinuxKernelProposal',
),
migrations.RemoveField(
model_name='fossineducationproposal',
name='proposalbase_ptr',
),
migrations.RemoveField(
model_name='legalissuesproposal',
name='proposalbase_ptr',
),
migrations.RemoveField(
model_name='libregraphicsproposal',
name='proposalbase_ptr',
),
migrations.RemoveField(
model_name='mobiledevicesproposal',
name='proposalbase_ptr',
),
migrations.RemoveField(
model_name='p2plocalfirstproposal',
name='proposalbase_ptr',
),
migrations.RemoveField(
model_name='scienceofcommunityproposal',
name='proposalbase_ptr',
),
migrations.RemoveField(
model_name='supportingusergroupsproposal',
name='proposalbase_ptr',
),
migrations.AlterModelOptions(
name='linuxkernelproposal',
options={'verbose_name': 'Linux Kernel talk proposal'},
),
migrations.DeleteModel(
name='DistrosProposal',
),
migrations.DeleteModel(
name='FOSSInEducationProposal',
),
migrations.DeleteModel(
name='LegalIssuesProposal',
),
migrations.DeleteModel(
name='LibreGraphicsProposal',
),
migrations.DeleteModel(
name='MobileDevicesProposal',
),
migrations.DeleteModel(
name='P2PLocalFirstProposal',
),
migrations.DeleteModel(
name='ScienceOfCommunityProposal',
),
migrations.DeleteModel(
name='SupportingUserGroupsProposal',
),
]

View file

@ -160,66 +160,41 @@ class MiniconfSessionProposal(Proposal):
abstract = True
class CampKDEProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Camp KDE talk proposal"
class DatabasesProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Databases talk proposal"
class DistrosProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Distros talk proposal"
class FOSSInDailyLifeProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "FOSS in Daily Life talk proposal"
class FOSSInEducationProposal(MiniconfSessionProposal):
class LinuxKernelProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "FOSS in Education talk proposal"
verbose_name = "Linux Kernel talk proposal"
class LegalIssuesProposal(MiniconfSessionProposal):
class OpenSourceGovernanceAndCommunitySustainabilityProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Legal Issues talk proposal"
verbose_name = "Open Source Governance and Community Sustainability talk proposal"
class LibreGraphicsProposal(MiniconfSessionProposal):
class RightToRepairProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Libre Graphics talk proposal"
class LinuxKernalProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Linux Kernal talk proposal"
class MobileDevicesProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Mobile Devices talk proposal"
class P2PLocalFirstProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Peer-to-Peer and Local First talk proposal"
class ScienceOfCommunityProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Science of Community talk proposal"
class SupportingUserGroupsProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Supporting User Groups talk proposal"
class XMPPProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "XMPP talk proposal"
verbose_name = "Right to Repair talk proposal"
class WildCardProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "Wild card talk proposal"
class XMPPProposal(MiniconfSessionProposal):
class Meta:
verbose_name = "XMPP talk proposal"

View file

@ -397,19 +397,14 @@ MARKDOWNIFY = {
}
}
CONFERENCE_ID = 4
CONFERENCE_ID = 5
PROPOSAL_FORMS = {
"camp-kde": "pinaxcon.proposals.forms.CampKDEProposalForm",
"databases": "pinaxcon.proposals.forms.DatabasesProposalForm",
"distros": "pinaxcon.proposals.forms.DistrosProposalForm",
"foss-in-daily-life": "pinaxcon.proposals.forms.FOSSInDailyLifeProposalForm",
"foss-in-education": "pinaxcon.proposals.forms.FOSSInEducationProposalForm",
"legal-issues": "pinaxcon.proposals.forms.LegalIssuesProposalForm",
"libre-graphics": "pinaxcon.proposals.forms.LibreGraphicsProposalForm",
"linux-kernel": "pinaxcon.proposals.forms.LinuxKernelProposalForm",
"mobile-devices": "pinaxcon.proposals.forms.MobileDevicesProposalForm",
"peer-to-peer-local-first": "pinaxcon.proposals.forms.P2PLocalFirstProposalForm",
"science-of-community": "pinaxcon.proposals.forms.ScienceOfCommunityProposalForm",
"supporting-user-groups": "pinaxcon.proposals.forms.SupportingUserGroupsProposalForm",
"open-source-governance-and-community-sustainability": "pinaxcon.proposals.forms.OpenSourceGovernanceAndCommunitySustainabilityProposalForm",
"right-to-repair": "pinaxcon.proposals.forms.RightToRepairProposalForm",
"xmpp": "pinaxcon.proposals.forms.XMPPProposalForm",
"wild-card": "pinaxcon.proposals.forms.WildCardProposalForm",
}
@ -566,8 +561,8 @@ CONFERENCE_NAME = os.environ.get('CONFERENCE_NAME', 'FOSSY')
CONFERENCE_NAME_SHORT = os.environ.get('CONFERENCE_NAME_SHORT', 'FOSSY')
CONFERENCE_EMAIL = os.environ.get('CONFERENCE_EMAIL', DEFAULT_FROM_EMAIL)
CONF_TZINFO = pytz.timezone(TIME_ZONE)
CONF_START = CONF_TZINFO.localize(datetime(2025, 7, 31))
CONF_END = CONF_TZINFO.localize(datetime(2025, 8, 3))
CONF_START = CONF_TZINFO.localize(datetime(2026, 8, 6))
CONF_END = CONF_TZINFO.localize(datetime(2026, 8, 9))
CONF_MINICONF_END = CONF_TZINFO.localize(datetime(2023, 3, 14, 23, 59))
EARLY_BIRD_DEADLINE = CONF_TZINFO.localize(datetime(2023, 1, 28))
PENGUIN_DINNER_TICKET_DATE = date(2023, 3, 15)

View file

@ -11,7 +11,7 @@
<div class="col-md-4">
<form method="POST" action="{% url "account_login" %}" autocapitalize="off" {% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
<legend>{% trans "Log in to an existing account" %}</legend>
<div class="alert alert-primary">Please note that accounts from 2024 are not transferred for privacy reasons.</div>
<div class="alert alert-primary">Please note that accounts from previous years are not transferred for privacy reasons.</div>
{% csrf_token %}
{{ form|bootstrap }}
{% if redirect_field_value %}

View file

@ -4,11 +4,11 @@
{# NOTE: This template is not used due to flatpages. #}
{# Description duplicated because you can't include the same block twice. #}
{% block og_desc %}FOSSY (Free and Open Source Yearly) is a 4 day community-oriented conference focused on the creation and impact of free and open source software. Join us in Portland, OR - July 31st August 3rd 2025 at Portland State University.{% endblock %}
{% block og_desc %}FOSSY (Free and Open Source Yearly) is a 4 day community-oriented conference focused on the creation and impact of free and open source software. Join us in Vancouver, Canada - August 6th 9th 2026 at University of British Columbia.{% endblock %}
{% block meta_desc %}FOSSY (Free and Open Source Yearly) is a 4 day community-oriented conference focused on the creation and impact of free and open source software. Join us in Portland, OR - July 31st August 3rd 2025 at Portland State University.{% endblock %}
{% block meta_desc %}FOSSY (Free and Open Source Yearly) is a 4 day community-oriented conference focused on the creation and impact of free and open source software. Join us in Vancouver, Canada - August 6th 9th 2026 at University of British Columbia.{% endblock %}
{% block head_title %}FOSSY 2025: The third Free and Open Source Software Yearly conference{% endblock %}
{% block head_title %}FOSSY 2026: The third Free and Open Source Software Yearly conference{% endblock %}
{% block body_class %}home{% endblock %}
@ -16,8 +16,8 @@
<header class="pt2-ns pb4">
<div class="flex-ns center">
<div class="mr4 dark-green sans-serif" style="flex-grow: 1">
<h1 class="f-subheadline f-headline-ns b lh-solid tracked-tight mv0">FOSSY 2025</h1>
<h2 class="f3 f2-ns b lh-solid mt0 mb3">July 31st August 3rd 2025 — Portland, OR</h2>
<h1 class="f-subheadline f-headline-ns b lh-solid tracked-tight mv0">FOSSY 2026</h1>
<h2 class="f3 f2-ns b lh-solid mt0 mb3">August 6th 9th 2026 — University of British Columbia, Canada</h2>
<h3 class="f4 f4-ns b lh-title mv2 mv3-ns">The first Free and Open Source Software Yearly conference</h3>
</div>
<div class="lh-solid mt4 mt0-ns" style="font-size: 10rem; max-width: 250px;"><img class="db" src="{% static 'img/conservancy_logo_tall_mono.svg' %}" style="max-height: 180px" alt="Software Freedom Conservancy"></div>
@ -28,7 +28,7 @@
</header>
<section id="content">
<h1 class="f3 mt0 mb4">FOSS is back in Portland, OR at Portland State University!</h1>
<h1 class="f3 mt0 mb4">FOSS in Vancouver, Canada at University of British Columbia!</h1>
<div class="flex-ns">
<div class="mw6">
<p class="f4 mt0">Software Freedom Conservancy is so proud to announce that we are hosting a community oriented conference this coming summer. FOSSY (Free and Open Source Yearly) is focused on the creation and impact of free and open source software, uplifting contributors of all experience.</p>

View file

@ -5,7 +5,7 @@
<div class="container">
<h2 class="sans-serif f2 f1-ns b lh-solid tracked-tight mv0 mr3">
<a class="washed-yellow hover-washed-yellow" href="/" style="text-decoration: none">
FOSSY 2025
FOSSY 2026
</a>
</h2>

View file

@ -96,7 +96,7 @@
<path d="M250.66,374.21V399H247V374.21Z" fill="#36a852"/>
<path d="M265.49,393.87l2.88,1.92a8.4,8.4,0,0,1-7,3.75,8.26,8.26,0,0,1-8.38-8.45c0-5,3.61-8.45,8-8.45s6.53,3.49,7.23,5.38l.39,1-11.3,4.67a4.3,4.3,0,0,0,4.1,2.56A4.82,4.82,0,0,0,265.49,393.87Zm-8.87-3,7.56-3.13a3.28,3.28,0,0,0-3.14-1.79A4.63,4.63,0,0,0,256.62,390.83Z" fill="#ea4535"/>
<rect x="160.95" y="373.04" width="112" height="36" fill="none"/>
<text transform="translate(84.43 102.23)" font-size="15" fill="#231f20" font-family="SourceSansPro-Regular, Source Sans Pro">July 31st August 3rd 2025
<text transform="translate(84.43 102.23)" font-size="15" fill="#231f20" font-family="SourceSansPro-Regular, Source Sans Pro">August 6th 9th 2026
</text>
<g id="Layer_2" data-name="Layer 2">
<g id="emperor">

Before

Width:  |  Height:  |  Size: 116 KiB

After

Width:  |  Height:  |  Size: 116 KiB

View file

@ -128,9 +128,9 @@
</div> -->
<div class="row">
<div class="col-md-4 pb-4">
<strong>FOSSY 2025</strong> <br>
July 31st August 3rd 2025 <br>
Portland, OR<br>
<strong>FOSSY 2026</strong> <br>
August 6th 9th 2026 <br>
Vancouver, Canada<br>
Timezone: PDT - UTC-7 <br>
<a href="mailto:{{ settings.CONFERENCE_EMAIL }}" alt="Email"><i class="bi-envelope-fill"></i></a>
<a href="https://x.com/conservancy" alt="Twitter"><i class="bi-twitter-x"></i></a>
@ -145,7 +145,7 @@
<div class="col-md-4 pb-4 text-right">
<small>
<a href="#">Back to top</a><br>
&copy; 2025 <a href="https://sfconservancy.org/">Software Freedom Conservancy</a><br>
&copy; 2026 <a href="https://sfconservancy.org/">Software Freedom Conservancy</a><br>
<a href="/credits/">Credits</a>
</small>
</div>

View file

@ -0,0 +1,28 @@
# Generated by Django 2.2.28 on 2026-03-19 06:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('symposion_proposals', '0003_auto_20170702_2250'),
]
operations = [
migrations.AlterField(
model_name='proposalbase',
name='abstract',
field=models.TextField(help_text="This will appear in the conference programme. Up to about 500 words. This field supports <a href='https://daringfireball.net/projects/markdown/syntax' target='_blank'>Markdown</a>, with limitations on allowed elements.", verbose_name='Abstract'),
),
migrations.AlterField(
model_name='proposalbase',
name='private_abstract',
field=models.TextField(help_text="This will only be shown to organisers and reviewers. You should provide any details about your proposal that you don't want to be public here. This field supports <a href='https://daringfireball.net/projects/markdown/syntax' target='_blank'>Markdown</a>, with limitations on allowed elements.", verbose_name='Private Abstract'),
),
migrations.AlterField(
model_name='proposalbase',
name='technical_requirements',
field=models.TextField(blank=True, help_text="Speakers will be provided with: Internet access, power, projector, audio. If you require anything in addition, please list your technical requirements here. Such as: a static IP address, A/V equipment or will be demonstrating security-related techniques on the conference network. This field supports <a href='https://daringfireball.net/projects/markdown/syntax' target='_blank'>Markdown</a>, with limitations on allowed elements.", verbose_name='Special Requirements'),
),
]

View file

@ -305,7 +305,7 @@ def schedule_json(request):
class EventFeed(ICalFeed):
product_id = '-//2025.fossy.us/schedule//EN'
product_id = '-//2026.fossy.ca/schedule//EN'
timezone = settings.TIME_ZONE
filename = 'conference.ics'

View file

@ -0,0 +1,23 @@
# Generated by Django 2.2.28 on 2026-03-19 06:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('symposion_speakers', '0013_merge_20260219_2116'),
]
operations = [
migrations.AlterField(
model_name='speaker',
name='biography',
field=models.TextField(blank=True, help_text="This will appear on the conference website and in the programme. Please write in the third person, eg 'Alice is a Moblin hacker...', 150-200 words. This field supports <a href='https://daringfireball.net/projects/markdown/syntax' target='_blank'>Markdown</a>, with limitations on allowed elements.", verbose_name='Biography'),
),
migrations.AlterField(
model_name='speaker',
name='experience',
field=models.TextField(blank=True, help_text="Have you had any experience presenting elsewhere? If so, we'd like to know. Anything you put here will only be seen by the organisers and reviewers; use it to convince them why they should accept your proposal. This field supports <a href='https://daringfireball.net/projects/markdown/syntax' target='_blank'>Markdown</a>, with limitations on allowed elements.", verbose_name='Speaking experience'),
),
]